首页 > 解决方案 > JS:计算数组中元素的频率

问题描述

我正在练习使用这个函数计算数组中唯一元素的频率,我在 StackOverflow 上找到了这个函数:

let numArray = [1,3,8,10,39,67,88,12,11,9,1,8,1,8]
let countFrequency = function(arr){
     var counts = {};
     for (var i = 0; i < arr.length; i++) {
          var num = arr[i];
          counts[num] = counts[num] ? counts[num] + 1 : 1;
          }
console.log(counts)
}

然后像这样调用函数:

countFrequency(numArray);

结果是这样的: {"1":3, "3":1, "8":3,...etc} 这是正确的和所需的行为。

然而。我不知道为什么会这样以及“幕后”发生了什么。这是 StackOverflow 上针对此类问题的常见解决方案,但我找不到对这一行的明确解释:

counts[num] = counts[num] ? counts[num] + 1 : 1;

我知道这是一个三元运算符以及运算符本身是如何工作的,但我一生都无法理解它是如何构建“计数”对象的。任何人都可以准确解释这个解决方案是如何工作的,或者向我指出一篇解释这个问题的文章的方向吗?我认为这对其他正在学习这项技术的人也很有用,所以在此先感谢!

标签: javascriptarraysconditional-operator

解决方案


如果您尝试读取一个不存在的属性,它会返回undefined,这在 javascript 中是错误的。因此,考虑到这一点,让我们将三元组扩展为简写if语句

if(counts[num]){
   counts[num] = counts[num] + 1;
}
else {
   counts[num] = 1
}

希望这可以用伪代码更清楚地说明发生了什么

if counts[num] has previously been set
   add one to counts[num]
otherwise
   set counts[num] to 1

另一件可能让您感到困惑的事情是用于读取属性的方括号表示法。在 javascript 中myObject.foomyObject["foo"]是等价的。


推荐阅读