2012-01-23 10 views
3

私はJavaScriptに移植していますいくつかのPythonコードを持っている:このJavascriptはどのようにしてより簡潔に表現できますか?

word_groups = defaultdict(set) 
for sentence in sentences: 
    sentence.tokens = stemmed_words(sentence.str_) 
    for token in sentence.tokens: 
     word_groups[sentence.actual_val].add(token) 

私はJavascriptについて多くを知らないので、これは私が何ができる最高だった:

var word_groups = {} 
for(var isent = 0; isent < sentences.length; isent++) { 
    var sentence = sentences[isent] 
    sentence.tokens = stemmed_words(sentence.str_) 
    for(var itoken = 0; itoken < sentence.tokens.length; itoken++) { 
     var token = sentence.tokens[itoken] 
     if(!(sentence.actual_val in word_groups)) 
      word_groups[sentence.actual_val] = [] 
     var group = word_groups[sentence.actual_val] 
     if(!(token in group)) 
      group.push(token) 
    } 
} 

ことができます誰にもJavaScriptコードをPythonのように見せる方法を提案しますか?次のように

+2

おそらく[codereview.stackexchange(http://codereview.stackexchange.com/)に属します。 –

+3

英語を中国語のように見せることができますか? – epascarello

+2

@epascarello、私はあなたの質問のポイントを理解していますが、より簡潔な方法でJSコードを表現する方法を尋ねることは良い質問です。 – zzzzBov

答えて

1

forEachが利用可能な環境を使用している場合は、reduceObject.keysも使用できると仮定します。 (例えばECMAScriptの> = 1.8.5):

var word_groups = sentences.reduce(function (groups, sentence) { 
    var val = sentence.actual_val 
    var group = groups[val] = groups[val] || [] 
    stemmed_words(sentence.str_).forEach(function (t) { 
    if (!(t in group)) group.push(t) 
    }) 
    return groups 
}, {}) 
+0

かなりクールです。ありがとう。 –

1

それは私があなたのPythonのコードが何を誤解していますが、ワードカウント後にしていると仮定したことが十分に可能だ、私はそれを書くと思います:

var word_groups = {} 
sentences.forEach(function (sentence) { 
    sentence.tokens = stemmed_words(sentence.str_) 
    sentence.tokens.forEach(function (token) { 
    var val = sentence.actual_val 
    word_groups[val] = (word_groups[val] || 0) + 1 
    }) 
}) 

は、上記の失敗する言葉は「すべきコンストラクタ "が入力に表示されます。それはこのJavaScriptの癖を回避することが可能です:

var word_groups = {} 
sentences.forEach(function (sentence) { 
    sentence.tokens = stemmed_words(sentence.str_) 
    sentence.tokens.forEach(function (token) { 
    var val = sentence.actual_val 
    if (!word_groups.hasOwnProperty(val)) word_groups[val] = 0 
    word_groups[val] += 1 
    }) 
}) 
+0

単語数を超えていません。それぞれの文は値(1、2、または3)を持ち、同じ値を持つすべての文からユニークな単語をグループ化したいと思います。つまり、値が3の文のセットが['foo bar'、 'foo baz'、 'bar baz ball']、word_groups [3] == ['foo'、 'bar'、 ' baz '、' ball '] –

+0

forEachは素晴らしく見えます。ありがとうございました。 –

0

あなたは(注目すべきIE 8はJavascript 1.5を持っている)、Javascriptを1.6以上に間違いないなら、あなたが互換性層としてのjQueryをしたいことがあります。たとえば、$。each(a、f)はa.forEach(f)と互換性があります。

関連する問題