125*_*748 7 javascript mapreduce node.js
在节点学校的心血来潮,我试图用来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}
Run Code Online (Sandbox Code Playgroud)
是那种工作.出于某种原因,reduce似乎跳过第一个元素.我不知道为什么.它第一次通过阵列,index是1.我试着加入一些逻辑,比如,if (index === 1){//put 'prev' as a property of 'obj'}.但这似乎真的很复杂.我确定这不是节点学校希望我解决这个问题的方式.但是,我想知道什么是访问你正在减少的数组中的第0个元素的好方法.为什么这个零级元素似乎被还原过程忽略了?我想我可以在fruits[0]回调后传入,所以我最初从该值开始.访问此第0个元素的最佳方法是什么?
Jos*_*eph 12
如果未
initialValue提供,previousValue则将等于数组中的第一个值,并且currentValue将等于第二个值.
此外,您必须从函数返回一个值.该值成为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));Run Code Online (Sandbox Code Playgroud)
这是一个简单的图表:
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}
Run Code Online (Sandbox Code Playgroud)
的语法reduce()是:
arr.reduce( callback [, initial] );
Run Code Online (Sandbox Code Playgroud)
如果省略initialvalue,callback将被调用 5 次,并arr[0]作为 的初始值传入previous:
callback( previous=arr[0], current=arr[1], index=0, array=arr );
callback( previous , current=arr[2], index=1, array=arr );
callback( previous , current=arr[3], index=2, array=arr );
callback( previous , current=arr[4], index=3, array=arr );
callback( previous , current=arr[5], index=4, array=arr );
Run Code Online (Sandbox Code Playgroud)
如果包含initialvalue,callback将被调用 6 次,initial并作为 的初始值传入previous:
callback( previous=initial, current=arr[0], index=0, array=arr );
callback( previous , current=arr[1], index=1, array=arr );
callback( previous , current=arr[2], index=2, array=arr );
callback( previous , current=arr[3], index=3, array=arr );
callback( previous , current=arr[4], index=4, array=arr );
callback( previous , current=arr[5], index=5, array=arr );
Run Code Online (Sandbox Code Playgroud)
因为您正在构建一个对象,所以我建议您传入一个空对象{ }作为initial值:
arr.reduce( callback [, initial] );
Run Code Online (Sandbox Code Playgroud)
参考: