javascript计算数组中的重复项

时间:2017-07-06 15:30:33

标签: javascript

请考虑这个JS功能

我已经看到了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||在做什么。

3 个答案:

答案 0 :(得分:3)

我想主要的困惑来自这一行:

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。在这种情况下,左侧将是“真实的”,它将返回新的计数。

答案 1 :(得分:1)

尚未设置数组值,因此无法增加undefined。第一次命中一个值时,“|| 1”部分将初始值设置为1.如果它再次击中相同的索引(不再是未定义的,现在设置为1),则执行左侧而是递增预先存在的值为1.

答案 2 :(得分: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计数`因为javascript是松散类型的
  3. 评估从左到右开始 counts[ResultArray[p]] = (counts[ResultArray[p]] + 1) || 1; javascript从count[ResultArray[p]]开始评估 counts计算到一个对象(set,dictionary),然后移动到ResultArray,在运行时p计算到数组,然后在第一次迭代中计算为0,因此整个评估是counts[ResultArray[0]]其中javascript创建密钥counts.acounts."a"并为其分配未定义的评估,然后继续 (counts[ResultArray[p]] + 1) || 1;并且它内部counts[ResultArray[p]]因为它已经在上一步中完成了评估为counts.acounts."a" =未定义然后移动到undefined +这应该在左右评估之后看起来像这样(undefined + 1) 然后,javascript会在下一步评估中将其评估为NaN &#39;(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 {1}}计数&#34; A&#34;或or = 1
  4. 这里是从左到右分解的javascript评估步骤 counts[a]

      javascript
    1. counts[ResultArray[p]] = (counts[ResultArray[p]] + 1) || 1;(对象,集合或字典)​​
    2. counts = {}(数组)
    3. ResultArray(整数)
    4. 第一次迭代中
    5. p
    6. ResultArray[p] = "a"(由于之前没有分配,因此分配了未定义)
    7. =(赋值运算符)
    8. javascript
    9. counts["a"](对象,集合或字典)​​
    10. counts = {}(数组)
    11. ResultArray(整数)
    12. 第一次迭代中
    13. p
    14. ResultArray[p] = "a"(未定义)
    15. counts["a"](加法操作)
    16. +(整数)
    17. 1
    18. counts["a"] + 1 = undefined + 1 = NaN = 1(布尔值1 =真假= 0南= 0 =假0 || 1 1胜或声明)
    19. 计算[&#34; a&#34;] = 0 || 1(1分配给计数[&#34; a&#34;])