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.foo
和 myObject["foo"]
是等价的。
我正在练习使用这个函数计算数组中唯一元素的频率,我在 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.foo
和 myObject["foo"]
是等价的。