首页 > 解决方案 > 使用 .reduce 对每个名称求和

问题描述

我有一个像这样的对象数组:

var array = [{name: "john", points: 20},
           {name: "jack", points: 12},
           {name: "john", points: 10},
           {name: "jack", points: 2},
           {name: "bill", points: 4}]

从这个数组中,我想生成一个新数组,其中包含每个名称的点的总和,通常如下所示:

var newArray = [{name: "john", points:30},
                {name: "jack", points:14},
                {name: "bill", points:4}]

我编写了以下运行良好的函数。

function filterArray(array){
    var newArray=[]
    for (i in array){
        var index=newArray.map(x=>x.name).indexOf(array[i].name)
        if (index==-1){
            newArray.push(array[i])
        }
        else{
            newArray[index].points+=array[i].points 
        }
    }
    return newArray;
    }

但是,我想使用一些可能更优雅的东西,比如 .reduce() 函数。有人知道怎么做吗?

标签: javascriptsumgroupingreduce

解决方案


您可以使用reduce分组功能Object.values和提取值的功能。

let array = [{name: "john", points: 20},{name: "jack", points: 12},{name: "john", points: 10},{name: "jack", points: 2},{name: "bill", points: 4}],
    result = Object.values(array.reduce((a, {name, points}) => {
      (a[name] || (a[name] = {name, points: 0})).points += points;
      return a;
    }, Object.create(null)));
    
console.log(result);
.as-console-wrapper { min-height: 100%; }


推荐阅读