JavaScript中的
reduce()
方法用于遍历数组,并根据某些逻辑从中累积出一个单一的值。
让我们来分解一下代码:
const occurrences = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4].reduce(function (acc, curr) {
return acc[curr] ? ++acc[curr] : acc[curr] = 1, acc
}, {});
reduce()
方法接受两个参数:
一个在 数组 的每个元素上执行的函数。这个函数接受两个参数:累加器(acc
)和当前正在处理的值(curr
)。累加器是在每次迭代函数时返回并累加的值。
累加器的可选初始值。在这种情况下,初始值是一个空对象{}
。
让我们找出作为第一个参数传递给reduce()
的函数:
function (acc, curr) {
return acc[curr] ? ++acc[curr] : acc[curr] = 1, acc
}
在每次迭代中,此函数会检查当前值(
curr
)是否已存在于累加器(
acc
)中作为键。如果是,则递增该键的
值。如果不是,则将
键添加到累加器中,并赋予一个值为1的
值。
逻辑分解如下:
return acc[curr] ? ++acc[curr] : acc[curr] = 1, acc
acc[curr] ?
: 这个语句检查当前的值 (curr
) 是否存在于累加器 (acc
) 中作为一个键。
++acc[curr]
: 如果该键存在,则增加与该键相关联的值。
: acc[curr] = 1
: 如果该键不存在,则将该键添加到累加器中,并将其值设置为1。
, acc
: 最后,返回更新后的累加器。
在每次迭代中,reduce()
方法要么增加现有数字的计数,要么为acc
对象中的新数字初始化计数为1。
所有迭代完成后,将累加器对象的最终值分配给变量 occurrences,并打印到控制台:
console.log(occurrences) // {2: 5, 4: 1, 5: 3, 9: 1}
这表明原始数组中数字2出现了5次,数字5出现了3次,数字4出现了1次,数字9出现了1次。
obj
{}
。循环中,检查是否存在obj[num]
,如果不存在则初始化为 1,否则将其加 1。 - cmgchess?
)的左侧是测试键/值等是否存在,但这是不正确的:它将表达式评估为真值/假值(并且0
被包括在假值中)。要检查键是否存在,您需要使用curr in acc ? ...
。 - jsejcksn