0%

reduce

arr.reduce(callback(accumulator,currentValue,index,array),InitValue)

callback:执行数组中的每个值的函数,包括4个参数:

accumulator

  • currentValue

    数组中正在处理的元素。

  • index 可选

    数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,否则从索引1起始。

  • array可选

    调用reduce()的数组

initialValue可选

作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。

返回累计处理后的结果

求数组中的所有值的和

1
2
3
4
5
6
7
8
9
10
var sum=[0,1,2,3].reduce(function(accumulator,currentValue){
return accumulator+currentValue;
},0)
//6
//累加对象数组里的值
var InitValue=0;
var sum=[{x:1},{x:2},{x:3}].reduce(function(accumulator,currentValue){
return accumulator+currentValue;
},InitValue);
console.log(sum);//6

将二维数组转为一维

1
var flattened=[[0,1],[2,3],[4,5],[6,7]].reduce(function(a,b){return a.concat(b);},[])

计算数组中每个元素出现的个数

1
2
3
4
5
6
7
8
9
10
11
var names=['Alice','Bob','Ann','Alice','Bob'];
var countNames=names.reduce((allNames,name)=>{
if(name in allNames){
allNames[name]++;
}
else{
allNames[name]=1;
}
return allNames;
},{});
console.log(countNames);

按照属性对object分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var people=[
{name:'Alice',age:20},
{name:'Max',age:20},
{name:'Jane',age:21}
]
function groupBy(objectArray,property){
return objectArray.reduce(function(acc,obj){
var key=obj[property];
if(!acc[key]){
acc[key]=[];
}
acc[key].push(obj);
return acc;

},{});
}
var groupedPeople=groupBy(people,'age');
console.log(groupedPeople);

使用扩展运算符绑定包含在对象数组中的数组

1
2
3
4
5
6
7
8
9
var friends=[{
name:'Anna',
books:['Bible','Harry Potter'],
age:21
},
{name:'Bob',books:['War and Peace'],age:16},
{name:'Mike',books:['The Shining','The Lord of the Rings'],age:18}];
var allBooks=friends.reduce((prev,curr)=>{return [...prev,...curr.books]},['Alphabet']);
console.log(allBooks);

数组去重

1
2
3
4
5
6
7
8
9
let myArray=[6,6,6,2,3,3,4,4,4,5];
let myOrderedArray=myArray.reduce((accumulator,currval)=>{
if(accumulator.indexOf(currval)==-1){
accumulator.push(currval);
}
return accumulator;

},[])
console.log(myOrderedArray);