reduce方法在平时用的比较少,最近整理数组去重觉得它还是挺好用的,然而它还有好多功能,下面就梳理一下它都有哪些用法。
一、mdn给的解释:
reduce()
方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。
提取一下:
1. 为数组的每个值从左到右执行提供的函数;
2. 将数组缩减为单个值(函数遍历整个数组后的结果)。
二、语法:
arr.reduce(callback,[initialValue])
initialValue
可选,指定了初始值 initialValue
,则起始索引号为 0(从初始值开始计算),否则从索引 1 起始(从数组第一个元素开始计算)。
三、用法
1. 求和 / 求积
let arr=[1,2,3,4]
arr.reduce((x,y)=>x+y); //10
arr.reduce((x,y)=>x*y); //24
2. 对象里属性求和/求积
var result = [
{
subject: 'math',
score: 10
},
{
subject: 'chinese',
score: 20
},
];
result.reduce(function(prev, cur) {
return cur.score + prev; //和
return cur.score * prev; //积
}, 0); //30
3. 计算数组中每个元素出现的次数
let arr= ['x', 'y', 'z','y'];
arr.reduce((pre,cur)=>{
if(cur in pre){
pre[cur]++;
}else{
pre[cur]=1;
}
return pre;
},{}); //{x:1,y:2,z:1}
4. 将二维数组转化为一维数组 / 将多维数组转化为一维数组
let arr = [[1, 2], [2, 4]]
arr.reduce((pre,cur)=>{
return pre.concat(cur);
},[]) //[1, 2, 2, 4]
let arr = [[1, 2], [[3,4], 4]]
const newArr = function(arr){
return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
} //[1, 2, 3, 4, 4]
5. 数组去重 / 对象数组去重
//数组
let arr = [1,2,3,3,1]
let newArr = arr.reduce((pre,cur)=>{
if(!pre.includes(cur)){
return pre.concat(cur)
}else{
return pre
}
},[]) // [1, 2, 3]
//对象数组
let arr = [
{name: 'x', id:1},
{name: 'y', id:2},
{name: 'z', id:1},
]
let obj = {}
let newArr = arr.reduce((item, next)=>{
obj[next.id] ? "" : (obj[next.id] = true && item.push(next));
return item;
},[]) // [{name: 'x', id:1}, {name: 'y', id:2}]