2

次の文の出現をどのように見つけて数えることができますか?

sentences = [
    'black im yello'
    'green black and white'
    'green green green green green greenana'
    'i have no color'
]

find_char = [
    'green',
    'black',
    'white'
]

戻るべき

output = {
   'sentence 1' : 1 // just black
   'sentence 2' : 3 // green black white
   'sentence 3' : 6 // 5 green and green in 'green'ana
   'sentence 4' : 0
}

これが私の現在のコードです

var output = {};

for (var i = sentences.length - 1; i >= 0; i--) {
    var output_tmp = {}; 
    var occurance = 0; 
    for (x = 0; x < find_char.length; x++) {        
        j = 0;
        output_tmp[find_char[x]] = 0;
        // search if sentences then -1, if > -1 then there is a match
        while ((j = sentences[i].indexOf(find_char[x], j)) > -1) { 
            output_tmp[find_char[x]]++; 
            j++ 
        }
        occurance += output_tmp[find_char[x]];
    }
    output[i] = { 'sentence_no': i,  'occurance' : occurance};
}

これを行うより良い方法はありますか?

4

2 に答える 2

3

すべての単語を 1 つの正規表現に結合し、それを各文に適用します。

sentences = [
    'black im yello',
    'green black and white',
    'green green green green green greenana',
    'i have no color'
]

words = [
    'green',
    'black',
    'white'
]

re = new RegExp(words.join('|'), 'gi')

counts = sentences.map(function(sent) {
    return (sent.match(re) || []).length
})

これはコンソールに出力されます:

[1, 3, 6, 0]
于 2012-07-12T21:17:32.673 に答える
2

Javascript のmatch メソッドを使用して、コードを最適化できます。たとえば、文に現れる「緑」の数を見つけるには、次の式を使用できます。

sentences[i].match(/green/g).length)

したがって、コードは次のようになります

for( s in sentences ){
  var occurences = 0;
  for( f in find_char )
    occurences += (sentences[s].match(new RegExp(find_char[f], "g")) || []).length
  output[s] = { 'sentence_no': s,  'occurance' : occurences};
}
于 2012-07-12T21:06:57.313 に答える