Как добавить значение ключей похожих объектов в es6 - PullRequest
0 голосов
/ 13 сентября 2018

Вот мой массив объектов:

var x = [
    {_id: 1, total: 25},
    {_id: 1, total: 22},
    {_id: 2, total: 4},
    {_id: 2, total: 32},
    {_id: 3, total: 56},
    {_id: 4, total: 21},
    {_id: 4, total: 58},
]

Теперь я хочу получить всю общую сумму подобных ключей объекта, как это

[
    {_id: 1, total: 47},
    {_id: 2, total: 36},
    {_id: 3, total: 25}, 
    {_id: 4, total: 79},
]

Может кто-нибудь подсказать, как это сделать на es6

1 Ответ

0 голосов
/ 13 сентября 2018

Используйте reduce. reduce - это метод массива, который может преобразовать массив во что-то другое, то есть в другой массив, который может иметь другую длину. map всегда будет возвращать массив с одинаковым количеством элементов. И filter может вернуть массив, который имеет меньше элементов, но элементы не будут изменены.

Снижение дает вам более гибкое поведение. Вы можете изменить элементы, и вы можете хранить их так, как вам нравится.

const result = x.reduce((acc, el) => {
  const index = acc.findIndex(({_id}) => el._id === _id);
  if (index > -1) {
    acc[index].total += el.total;
  } else {
    acc.push({...el});
  }
  return acc;
}, [])

console.log(result);

В случае, если этот код будет выполняться часто и на больших массивах, вы можете использовать более производительное, но немного более сложное решение, где мы используем хеш-таблицу для хранения данных:

    var x = [
        {_id: 1, total: 25},
        {_id: 1, total: 22},
        {_id: 2, total: 4},
        {_id: 2, total: 32},
        {_id: 3, total: 56},
        {_id: 4, total: 21},
        {_id: 4, total: 58},
    ]
    
const temp = {};
for (const el of x) {
  temp[el._id] = (temp[el._id] || 0) + el.total;
}

const result = Object.entries(temp).map(([_id, total]) => ({_id, total}));

console.log(result);

Но перед тем, как начать оптимизацию, вы всегда должны проверить, стоит ли это делать, запустив perf tools.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...