javascript - 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;
我知道这是一个三元运算符以及运算符本身是如何工作的,但我一生都无法理解它是如何构建“计数”对象的。任何人都可以准确解释这个解决方案是如何工作的,或者向我指出一篇解释这个问题的文章的方向吗?我认为这对其他正在学习这项技术的人也很有用,所以在此先感谢!
解决方案
如果您尝试读取一个不存在的属性,它会返回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.foo
和myObject["foo"]
是等价的。
推荐阅读
- android - 以编程方式将 TextView 样式设置为 TabLayout.Tab 默认样式
- spring - Spring Boot Mail 使用访问令牌发送电子邮件
- allure - Codeceptjs:Allure 报告未显示“测试正文”部分中的所有步骤
- php - 在 if 语句中返回带有 $errors 的重定向
- c# - 使用 UserControl 的 Page.xaml 中的 VisualStateManager 在 UWP 应用程序中不起作用
- java - 在 Pageable 中自定义 REST 参数的路径
- r - 数据框:将每个组除以对应于R中每个组的向量?
- python - 使用十六进制值 PYTHON 覆盖文件中的咬痕
- svn - 更改日志消息列表中的字体大小
- opencv - cv::Size 断言失败