语法
arr.reduce(callback,[initialValue]);
callback函数的参数
参数 | 描述 |
---|---|
previousValue | 返回上一次计算结束后的返回值 |
currentValue | 数组中当前被处理的值 |
index | 当前元素在当前数组中的索引 |
array | reduce当前正在操作的数组 |
[initialValue]初始值
第二个参数值的选择需要看callback函数内如何定义值,如果只是一个数组内的加减乘除,最后返回一个数字的话,就只需要写一个 0 即可,如果为1就跳过0的索引直接到1
如果最后要输出一个数组,则参数为: []
如果最后输出的是一组由名值对的对象,则参数为: {}
如果不写初始值就会报错
1.简单数组内的值相加
var arr = [1,2,3];
var sum = arr.reduce((pre, cur, idx, arr) => {
console.log(prev, cur, index);
return prev + cur;
},0)
console.log(arr, sum); // [1,2,3] 6
2.计算数组中每个元素出现的次数
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
let nameNum = names.reduce((pre,cur)=>{
if(cur in pre){
pre[cur]++
}else{
pre[cur] = 1
}
return pre
},{})
console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
3.数组去重
let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((pre,cur)=>{
if(!pre.includes(cur)){
return pre.concat(cur)
}else{
return pre
}
},[])
console.log(newArr);// [1, 2, 3, 4]
4.将二维数组转化为一维
let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]
5.将多维数组转化为一维
let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = (arr)=>{
return arr.reduce((pre,cur)=> {
pre.concat(Array.isArray(cur)?newArr(cur):cur),
},[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
6.对象里的属性求和
var result = [
{
subject: 'math',
score: 10
},
{
subject: 'chinese',
score: 20
},
{
subject: 'english',
score: 30
}
];
var sum = result.reduce(function(prev, cur) {
return cur.score + prev;
}, 0);
console.log(sum) //60
实际使用:
问题:
var arr = [[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]]];
将这个多维数组扁平化为一个一维数组,并去重,按升序排序。
方法一:
var arr = [[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]]]
var fn = (arr)=>{
return arr.reduce((pre,cur,index,arr)=>{
return pre.concat(Array.isArray(cur)?fn(cur):cur)
},[])
}
let newArr = [...fn(arr)].reduce((pre,cur)=>{
if(!pre.includes(cur)){
return pre.concat(cur)
}else{
return pre
}
},[])
const result=Array.from(newArr).sort( (a,b)=>a-b)//数组排序,由小到大
console.log(result)//[1,2,3,4,5,6,7,8,9,11,12,13,14]
方法二:(更简洁)
var arr = [[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]]]
var fn = (arr)=>{
return arr.reduce((pre,cur,index,arr)=>{
return pre.concat(Array.isArray(cur)?fn(cur):cur)
},[])
}
const newArr=new Set([...fn(arr)])
const result=Array.from(newArr).sort((a,b)=>a-b)
console.log(result)