2014-11-24 30 views
2

我遇到了一段代碼,我試圖弄清楚,代碼基本上存儲了一個單詞出現在文本文檔中的時間量的發生,所以函數countWordsWordsIntext需要在所需的文本並顯示文字和發生在文本的數量, 如 會:3 但:5 非常6使用對象的Javascript三元運算符

一邊看着計數文本的話,我找不出如何功能有條件的十進制操作應該是有效的。一種解釋將是非常讚賞

var wordCounts = {}; 

function countWordsInText(text) { 
    var words = text.toString() 
       .toLowerCase() 
       .split(/\W+) 
       .sort(); 
    for(var index in words) { 
    var word = words[index]; 
    if(word) { 
    wordCounts[word] = 
     (wordCounts[word]) ? wordCounts[word] + 1 : 1; 
     } 
    } 
} 

function display() 
{ 
    for (var index in wordCounts) 
    console.log(index + ': ' + wordCounts[index]); 
} 

我不明白wordCounts[word]對象屬性如何更新。

+1

此代碼? 'wordCounts [word] = ....'也許換行符讓你感到困惑。如果wordCounts [word]存在,則增加它,否則將其設置爲1(因爲它是一個新條目)。它不是一個數組,它是一個可以使用字典/數組類型語法訪問成員的對象。 – 2014-11-24 20:14:20

回答

4

說你有

var foo = {}; 

被混淆線你會

foo.bar = foo.bar ? foo.bar + 1 : 1; // line A 

問問自己

  1. 什麼是foo.bar在開始?據不確定,我們沒有給foo屬性酒吧
  2. 執行了第一次行後是什麼foo.bar?它是1; foo.bar不確定這是falsy所以三元運營商提供給我們帶回1
  3. 什麼是foo.bar第二次行A之後執行?它是2; foo.bar1這是truthy,所以三元運營商提供給我們帶回foo.bar + 1

A線可以重複,直到你用完的數字或世界爆炸

寫它像這是一個辦法解決undefined + 1問題,這將使NaN


一個同樣有效的解決方案(我找了一下吸塵器親自閱讀)是做

foo.bar = (foo.bar || 0) + 1;