Получить уникальные значения и их суммы из массива объектов - PullRequest
0 голосов
/ 03 июля 2019

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

Это JSON, который отправляется почтальоном:

[
    {"name": "First value", "amount": 2},
    {"name": "Second value", "amount": 4},
    {"name": "First value", "amount": 6}  
]

Мне нужно вернуть ответ JSON с добавленными уникальными значениями и их итогами:

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

{
   "First value": 8,
   "Second value": 4
}

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Вы можете использовать reduce()

const arr = [ 
    {"name": "First value", "amount": 2},
    {"name": "Second value", "amount": 4},
    {"name": "First value", "amount": 6}  
]

const res = arr.reduce((ac, {name, amount}) => {
  ac[name] = ac[name] || 0;
  ac[name] += amount;
  return ac;
},{})

console.log(res)

Пояснение:

Прежде всего, мы инициализируем ac пустым объектом {}. Смотри строчку

arr.reduce((ac, {name, amount}) => {...}
                ^^^^^^^^^^^^^^ 

Выделенная часть называется разрушением объекта. Он получит свойство name и amount текущего объекта, через который мы выполняем итерацию, и сделает его независимыми переменными.

см. Строку

ac[name] = ac[name] || 0;

Теперь эта строка проверяет, не существует ли ac[name] для объекта ac, тогда оно будет undefined, поэтому undefined || 0 будет оцениваться как 0. Если оно будет иметь значение, значение ac[name] останется прежним.

см. Третью строку:

ac[name] += amount;

Эта строка добавит amount к уже значению ac[name]

Наконец, мы возвращаем ac, чтобы оно стало начальным значением ac для следующей итерации.

0 голосов
/ 03 июля 2019

Вы также можете просто использовать Array.forEach , поскольку по большей части легче понять и следовать:

let arr = [{ "name": "First value", "amount": 2 }, { "name": "Second value", "amount": 4 }, { "name": "First value", "amount": 6 } ],
    obj={}

arr.forEach(({name, amount}) => {
  obj[name] = obj[name] || 0
  obj[name] += amount
})

console.log(obj)

Основным отличием здесь является то, что наш accumulator (obj) определен снаружи, а не "внутренне" как аргумент функции Array.reduce.

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