2017-07-06 38 views
3

請考慮這個JS函數javascript數組中的重複項

我看過這個similar問題,但無法理解。

function a (ResultArray){ 
    var counts={}; 
    for (p = 0; p < ResultArray.length; p++){    
     counts[ResultArray[p]] = (counts[ResultArray[p]] + 1) || 1;    
    } 
    return counts; 
} 

var arr = ["a","b","c","d","a","b","e"];   
var res = new a(arr); 
console.log(res) 

其工作的罰款,並給予計數。我需要了解它是如何給予計數的,特別是(counts[ResultArray[p]] + 1) || 1;部分。什麼是+1||在做什麼。

+2

它看起來像它試圖增加特定鍵的值,然後如果失敗(因爲鍵不存在),它將它設置爲'1'。 ---老實說,這是一段很奇怪的代碼。 – byxor

+4

'+ 1'爲'counts [ResultArray [p]]加1,'||'爲真驗證:如果'counts [ResultArray [p]] + 1'爲'NaN,undefined,null或0 '表達式將評估爲'1'請參閱[this](https:// stackoverflow。com/questions/476436/is-there-a-null-coalescing-operator-in-javascript)post更詳細 –

+0

@Patrick Barr,那就是我想要理解的是什麼,它是通過加1實現的,還是什麼它通過加1.檢查它是否檢查下一個值?如果是這樣,那麼它如何跟蹤以前找到的值,然後遞增它們。它對我來說太令人困惑了 – user1207289

回答

2

我猜主要的困惑現有的預值來自這行:

counts[ResultArray[p]] = (counts[ResultArray[p]] + 1) || 1; 

||運算符返回的是在左邊,如果它是「truthy」(比其他任何「falsy」值false0'',nullundefinedNaN),否則返回右邊的內容。

如果ResultArray[p]不在counts之內,那麼counts[ResultArray[p]]將是undefined。由於undefined + 1NaN||的左側是「虛假」,所以它會返回右側1

否則,counts[ResultArray[p]]將是我們已經看到的次數ResultArray[p],我們會將1添加到它。在這種情況下,左側將是「truthy」,它將返回新的計數。

+0

我更加困惑1)當這個'var counts = {}; counts [「a」] = 1時,計數[ResultArray [p]]是多少次而不是'「a」;計數[ 「b」] = 2; console.log(counts [「a」]);'打印'1'。 2)可以說,我明白了1中的問題,當'ResultArray [p]'不在'counts'且它返回'1'時,這是否意味着它增加了'1'或迭代不計數。 – user1207289

+0

請忽略1)以上,我明白'數[ResultArray [p]]'是''a「'而不是'」a「的值' – user1207289

+1

@ user1207289假設'ResultArray [p]'是'」a「 '和''a「'不在」計數「中。然後'計數[ResultArray [p]] =(計數[ResultArray [p]] + 1)|| 1'與'counts [「a」] =(counts [「a」] + 1)||相同1',這與'counts [「a」] =(undefined + 1)||相同1',這與'counts [「a」] = NaN ||相同1',最後與'counts [「a」] = 1'相同。也就是說,當我們第一次遇到''a''時,我們把'counts [「a」]'設置爲'1'。 –

1

該數組值尚未設置,所以你不能增加未定義。第一次碰到一個值時,「|| 1」部分將初始值設置爲1.如果它再次碰到同一個索引(不再未定義,現在設置爲1),它將執行左側,而是遞增1。

+0

當我現在閱讀這個答案時,經過上面的解釋,這是有道理的。 – user1207289

0

有一些事情要記住在上述算法

  1. JavaScript對象是由集來表示,字典因此counts = {}只是一組或字典因此counts."a"counts.acounts[a]都可以用於訪問因此counts對象內的值counts.a = 1counts["a"] = null是計數設置(對象)的分配。
  2. JavaScript的動態分配變量因此counts[ResultArray[p]] since計數is a object javascript dynamically creates the value of ResultArray [P]] as a property or key to counts`如JavaScript是鬆散類型
  3. 評價從左至右上線啓動 counts[ResultArray[p]] = (counts[ResultArray[p]] + 1) || 1; 的JavaScript開始評估從開始count[ResultArray[p]]其中 counts評估爲一個對象(集,字典)然後將其移動到ResultArray其運行期間p評估爲陣列然後評估了一些說0在第一次迭代中,因此整個評價是counts[ResultArray[0]]其中的javascript創建密鑰counts.acounts."a"並分配給它未定義的評估,然後繼續到 (counts[ResultArray[p]] + 1) || 1;和它counts[ResultArray[p]]裏面,因爲它已經在前面的步驟計算結果爲counts.acounts."a" = undefined,則移動到undefined +這個看起來應該像這樣離開後正確的評價則(undefined + 1) JavaScript的評估完成,要在評估
    下一步NaN 「(NAN)|| 1 where的NaN is always false but 1 is always true in javascript and true = 1 false = 0 hence 1 is assigned to counts.a or計數。 「一」 或counts[a] = 1

這裏是從左至右分解 counts[ResultArray[p]] = (counts[ResultArray[p]] + 1) || 1;

JavaScript的評估步驟
  1. counts = {}(對象,設置或字典)中的JavaScript
  2. ResultArray(陣列)
  3. p(整數)
  4. ResultArray[p] = "a"在第一次迭代中
  5. counts["a"](未定義,因爲沒有先前的assignement被分配)
  6. =(賦值運算符)
  7. counts = {}(object,set或di CT)在第一次迭代中的JavaScript
  8. ResultArray(陣列)
  9. p(整數)
  10. ResultArray[p] = "a"
  11. counts["a"](未定義)
  12. +(加法運算)
  13. 1(整數)
  14. counts["a"] + 1 = undefined + 1 = NaN
  15. NaN || 1 = 1(boolean 1 = true false = 0 Nan = 0 = false 0 || 1 1贏得或聲明)
  16. counts [「a」] = 0 || 1(1被分配給計數[「a」])