Node 学校一时兴起,我尝试使用 reduce
来计算字符串在数组中重复的次数。
var fruits = ["Apple", "Banana", "Apple", "Durian", "Durian", "Durian"],
obj = {};
fruits.reduce(function(prev, curr, index, arr){
obj[curr] ? obj[curr]++ : obj[curr] = 1;
});
console.log(obj); // {Banana: 1, Apple: 1, Durian: 3}
有点在工作。出于某种原因,reduce
似乎跳过了第一个元素。我不知道为什么。第一次遍历数组,index
为1
。我尝试加入一些逻辑,例如 if (index === 1){//put 'prev' as a property of 'obj'}
。但这似乎确实令人费解。我确定这不是 Node 学校希望我解决这个问题的方式。但是,我想知道访问要减少的数组中第零个元素的好方法是什么。为什么这个第零个元素似乎被归约程序忽略了?我想我可以在回调之后传入 fruits[0]
,所以我最初从那个值开始。访问第零个元素的最佳方式是什么?
最佳答案
If no
initialValue
was provided, thenpreviousValue
will be equal to the first value in the array andcurrentValue
will be equal to the second.
此外,您必须从函数返回一个值。该值在下一次迭代中成为 previousValue
的值。
我建议您“携带”您的聚合器 obj
作为初始值。
var fruits = ["Apple", "Banana", "Apple", "Durian", "Durian", "Durian"];
var obj = fruits.reduce(function(carry, fruit){
if(!carry[fruit]) carry[fruit] = 0; // If key doesn't exist, default to 0
carry[fruit]++; // Increment the value of the key
return carry; // Return aggregator for next iteration
}, {});
alert(JSON.stringify(obj));
这是一个简单的图表:
fruit carry (before operation) carry (after operation, returned value)
1st iteration: Apple {} {Apple:1}
2nd iteration: Banana {Apple:1} {Apple:1, Banana:1}
3rd iteration: Apple {Apple:1, Banana:1} {Apple:2, Banana:1}
4th iteration: Durian {Apple:2, Banana:1} {Apple:2, Banana:1, Durian:1}
5th iteration: Durian {Apple:2, Banana:1, Durian:1} {Apple:2, Banana:1, Durian:2}
6th iteration: Durian {Apple:2, Banana:1, Durian:2} {Apple:2, Banana:1, Durian:3}
关于javascript - 如何访问reduce中的第零个元素以计算数组中的重复次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31465480/