const arr = [1, 3, 1, 2, 5, 2, 3, 4, 1, 2, 3, 4, 3]
const resultado = arr.reduce((prev, cur) => ((prev[cur] = prev[cur] + 1 || 1), prev), {})
//resultado = const resultado = { 1: 3, 2: 3, 3: 4, 4: 2, 5: 1,}
我是javascript的新手,我需要了解在下面的代码中,数组是如何以对象结束的。
- 创建一个空对象
- 对于阵列中的每个元素:
- 将[当前值加1时对象的值,但如果不存在,则将其值返回1]给当前索引值的键
- 返回对象,使其在下一次迭代中可用,并在最后用于最终索引
reduce
的工作原理是传入一个初始的";值";回叫作为";累加器";。累加器将是回调的第一个参数,数组迭代中的当前元素将是第二个。累加器在每次迭代中传递。
在这个简单的例子中,我们将把一些数字加起来。我们传入0
作为初始值。这将作为";累加器";(acc
(。c
是迭代中的当前元素。
在第一次迭代中,CCD_ 5是CCD_。在第二次迭代中是1
(0
+1
(。在第三次迭代中,它是3
(1
+2
(-总是加上当前元素的值,然后传递回回调,直到没有更多元素为止。
const arr = [1, 2, 3, 4, 5];
const out = arr.reduce((acc, c) => {
return acc + c;
}, 0);
console.log(out);
中的例子你的问题遵循相同的逻辑,但因为它都在一行上,所以更难理解,所以在这里它被扩展了:
- 我们传入的不是
0
作为初始值,而是一个空对象 - 如果对象的键与当前元素的值匹配,则将
1
添加到该属性值,否则将该属性值初始化为1
- 返回下一次迭代的累加器
const arr = [1, 3, 1, 2, 5, 2, 3, 4, 1, 2, 3, 4, 3];
const resultado = arr.reduce((acc, c) => {
if (acc[c]) {
++acc[c];
} else {
acc[c] = 1;
}
return acc;
}, {});
console.log(resultado);