2011-07-03 17 views

Odpowiedz

18

Należy podzielić ciąg na słowa, a następnie pętli poprzez słowa i przyrost wartości licznika dla każdego z nich:

var wordCounts = { }; 
var words = str.split(/\b/); 

for(var i = 0; i < words.length; i++) 
    wordCounts["_" + words[i]] = (wordCounts["_" + words[i]] || 0) + 1; 

"_" + pozwala przetwarzać słowa jak constructor które już właściwości obiektu.

Możesz napisać words[i].toLowerCase(), aby zliczać bez rozróżniania wielkości liter.

+1

Po prostu z ciekawości - czy masz gdzieś ten fragment, czy też znalazłeś rozwiązanie tylko dla tej odpowiedzi? Tak czy inaczej, jest niesamowita. :) –

+0

@ajax: Stworzyłem go na miejscu. Dzięki! – SLaks

+0

Hej wielkie dzięki, po prostu się zastanawiałem, czy mógłbyś wyjaśnić/\ b/argument? To jest wyrażenie regularne tak? –

0

Pochodzę z przyszłości, gdzie pytanie to zostało ponownie zadane, ale zacząłem zbyt wcześnie z rozwiązaniem i zostało oznaczone jako odpowiedź. W każdym razie jest to uzupełnienie odpowiedzi SLaks.

function nthMostCommon(string, ammount) { 
    var wordsArray = string.split(/\s/); 
    var wordOccurrences = {} 
    for (var i = 0; i < wordsArray.length; i++) { 
     wordOccurrences['_'+wordsArray[i]] = (wordOccurrences['_'+wordsArray[i]] || 0) + 1; 
    } 
    var result = Object.keys(wordOccurrences).reduce(function(acc, currentKey) { 
     /* you may want to include a binary search here */ 
     for (var i = 0; i < ammount; i++) { 
      if (!acc[i]) { 
       acc[i] = { word: currentKey.slice(1, currentKey.length), occurences: wordOccurrences[currentKey] }; 
       break; 
      } else if (acc[i].occurences < wordOccurrences[currentKey]) { 
       acc.splice(i, 0, { word: currentKey.slice(1, currentKey.length), occurences: wordOccurrences[currentKey] }); 
       if (acc.length > ammount) 
        acc.pop(); 
       break; 
      } 
     } 
     return acc; 
    }, []); 
    return result; 
} 
Powiązane problemy