JavaScript reduce()方法详解

语法

arr.reduce(callback,[initialValue]);

callback函数的参数

参数描述
previousValue返回上一次计算结束后的返回值
currentValue数组中当前被处理的
index当前元素在当前数组中的索引
arrayreduce当前正在操作的数组

[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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值