#介绍reduce
reduce() 方法接收一个函数作为累加器,reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(上一次回调的返回值),当前元素值,当前索引,原数组。

语法:arr.reduce(callback,[initialValue])

1
2
3
4
5
6
7
callback:函数中包含四个参数
- previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
- currentValue (数组中当前被处理的元素)
- index (当前元素在数组中的索引)
- array (调用的数组)

initialValue (作为第一次调用 callback 的第一个参数。)

#简单应用

1
2
3
4
5
const arr = [1, 2, 3, 4, 5]
const sum = arr.reduce((pre, item) => {
return pre + item
}, 0)
console.log(sum) // 15

#案例
##根据对象里面的某一项属性分类,如下效果所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let arr = [{index:0},{index:0},{index:1},{index:2},{index:2}];
let res = arr.reduce((pre,item)=>{
let temp = [];
pre.forEach((val)=>{
if(val&&val.length) {
if(val[0].index==item.index) {
val.push(item);
return pre;
}
}
})
temp.push(item);
pre.push(temp);
return pre;
},[]);

##结果如下:

img_1.pngclipboard.png

#不使用reduce实现上述需求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
groupBy(array, f) {
let groups = {};
array.forEach(function(o) {
let group = JSON.stringify(f(o));
groups[group] = groups[group] || [];
groups[group].push(o);
});
return Object.keys(groups).map(function(group) {
return groups[group];
});
};

let sorted = this.groupBy(this.arr, function(item){
return [item.index]; //根据对象里面的每一项的index分类
});