Использование уменьшить до группировки по сумме - PullRequest
0 голосов
/ 30 октября 2018

Я хочу вернуть массив, сгруппированный командой, с суммой gp, win, loss. Я пытаюсь сделать это с помощью снижения, однако, итоги не складываются. Вот мой код ...

const myArr = [
  {team: 'Red', gp: 3, win:2, loss:1},
  {team: 'Black', gp: 3, win:1, loss:2},
  {team: 'Red', gp: 10, win:8, loss:2}
]

let output = myArr.reduce(
  (acc, curr) => {
    acc[curr.team] = {
      gp: acc.gp + curr.gp,
      win: acc.win + curr.win,
      loss: acc.loss + curr.loss
    };
    return acc;
  }, {
    gp: 0,
    win: 0,
    loss: 0
  }
);

console.log(output);

Этот код возвращает массив в нужном мне формате, однако gp, win, loss не суммируются, вместо этого он показывает последнюю точку данных.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Я бы уменьшил элементы до уникального набора, используя Set, а затем сопоставил бы каждый элемент с новым объектом.

const teams = [{team: 'Red', gp: 3, win:2, loss:1},
{team: 'Black', gp: 3, win:1, loss:2},
{team: 'Red', gp: 10, win:8, loss:2}]

let result = [...new Set(teams.map(t => t.team))].map(team => {
  return {
    team,
    gp:   teams.reduce((sum, val) => val.team == team ? sum + val.gp   : sum, 0),
    win:  teams.reduce((sum, val) => val.team == team ? sum + val.win  : sum, 0),
    loss: teams.reduce((sum, val) => val.team == team ? sum + val.loss : sum, 0)
  }
}, [])

console.log(result)
0 голосов
/ 30 октября 2018

Вам нужно взять пустой объект в качестве аккумулятора, а затем вы можете взять нужные ключи для добавления.

const
    myArr = [{ team: 'Red', gp: 3, win: 2, loss: 1 }, { team: 'Black', gp: 3, win: 1, loss: 2 }, { team: 'Red', gp: 10, win: 8, loss: 2 }],
    keys = ['gp', 'win', 'loss'],
    output = myArr.reduce((acc, curr) => {
        acc[curr.team] = acc[curr.team] || Object.assign(...keys.map(k => ({ [k]: 0})));
        keys.forEach(k => acc[curr.team][k] += curr[k]);
        return acc;
  }, Object.create(null));

console.log(output);
...