Использование .reduce для суммирования баллов за каждое имя - PullRequest
1 голос
/ 25 апреля 2019

У меня есть массив объектов, который выглядит следующим образом:

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 ().Кто-нибудь знает, как это можно сделать?

1 Ответ

2 голосов
/ 25 апреля 2019

Вы можете использовать функцию 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%; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...