JS:计算数组中元素的频率

JS: Counting frequency of elements in an array

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

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} 这是正确的,也是预期的行为。

不过。我不知道为什么会这样,也不知道发生了什么 'under the hood'。这是 Whosebug 上针对此类问题的常见解决方案,但我找不到这一行的明确解释:

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

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

如果您尝试读取不存在的 属性 returns 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

另一件可能让您感到困惑的事情是 square bracket notation 用于读取属性。在 javascript 中 myObject.foomyObject["foo"] 是等价的。