2017-07-06 42 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”])