数组 reduce 方法使用记录

概述      

  reduce()方法对数组中每个元素执行一次 reduce()函数 —升序执行,将其结果汇总为单个返回值。

        reduce方法可做的事情特别多,就是训话遍历能做的,reduce都可以做,比如:数组求和,数组求积、数组中元素出现的次数、数组去重等。

语法

arr.reduce( (prev, cur, index, arr)=>{
    ……
}, int)

参数:

        prev,必需。累计器累计回调的返回值;表示上一次调用回调函数时的返回值,或者初始值init;

        cur,必需。表示当前正在处理的数组元素。

        index,可选。表示当前正在处理的数组元素的索引,若提供init值,则其实索引从0开始,否则起始索引为1.

        arr,可选。表示原数组。

        init,可选,表示初始值。

举例

        没有设置函数的初始迭代值

const arr = [1,2,3,4,5]
const sum = arr.reduce((prev,cur,arr,index)=>{
    console.log(prev, cur, index)
    return prev + cur
})
console.log('arr : ', arr,  "sum : ", sum)

运行结果

         分析:在这里reduce 的作用就是对这个数组进行求和,迭代了4次,函数迭代的初始值是1,也就是默认值(数值的第一项),prev的值是每次计算后的值。

        设置函数的初始迭代值

const arr = [1,2,3,4,5]
const sum = arr.reduce((prev,cur,arr,index)=>{
    console.log(prev, cur, index)
    return prev + cur
},5)
console.log('arr : ', arr,  "sum : ", sum)

运行结果

         分析:这里添加了一个初始值的迭代值,也就是让prev从5开始计算(以5为初始值求和),可以看到,这里迭代了5次,结果也加上了初始值。

reduce 的应用

        数组求和

let arr = [1,2,3,4,5]
console.log(arr.reduce((a, b)=> a+b))   // 15
console.log(arr.reduce((a, b)=> a*b))   // 120

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

var names = ['a', 'b', 'c', 'a', 'a', 'b']
var countedNames = names.reduce( (allNames, name )=>{
    // console.log(allNames, name)
    if(name in allNames){
        allNames[name] ++;
    }
    else{
        allNames[name] = 1
    }
    return allNames
}, {})
console.log(countedNames)

运行结果

去除数组中重复的元素

var names = ['a', 'b', 'c', 'a', 'a', 'b']
var countedNames = names.reduce( (allNames, name )=>{
     console.log(allNames, name)
    if(allNames.indexOf(name) === -1){
        allNames.push(name);
    }
    return allNames
}, [])
console.log(countedNames)

运行结果

 按属性对Object分类

var person = [
    {
        name: 'xiaoming',
        age: 18
    },{
        name: 'xiaohong',
        age: 17
    },{
        name: 'xiaogang',
        age: 17
    }
];
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 groupedPerson = groupBy(person, 'age');
console.log(groupedPerson);

 运行结果

 对对象的属性求和

let people = [
  { name: 'Alice', age: 21 },
  { name: 'Max', age: 20 },
  { name: 'Jane', age: 20 }
];
let result = people.reduce((a,b) =>{
    a = a + b.age;
    return a;
},0)

console.log(result) // - 结果:61
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值