Сравнение нескольких объектов в массиве и суммирование значений при определенном общем значении JavaScript / Vue.js - PullRequest
0 голосов
/ 03 апреля 2019

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

Существует массив из нескольких объектов, например, в моем случае:

const array = [
  {Id: 0, Name: 'John', Currency: 'USD', Amount: 25},
  {Id: 1, Name: 'Matt', Currency: 'EUR', Amount: 460},
  {Id: 2, Name: 'Lisa', Currency: 'YEN', Amount: 60000},
  {Id: 3, Name: 'Pete', Currency: 'EUR', Amount: 2400}
]

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

(например, валюта: 'EUR' (obj1 & obj2), сумма: 460 (obj1) + 2400 (obj2) = 2860)

Итак, конечный результат будет выглядеть примерно так:

const finalarray = [
  {Currency: 'USD', Amount: 25},
  {Currency: 'EUR', Amount: 2860},
  {Currency: 'YEN', Amount: 60000}
]

Лично я не против, если другие ключи объекта не существуют в конечном массиве, если:

1) Объекты массива сравнивают одно из своих значений со всеми другими значениями того же ключа, и

2) Суммы со значением одного и того же ключа объединяются между собой, все они.

Я работаю с проектом Vue.js, поэтому мне нужен язык JavaScript. Что приходит к ответу, тем проще, тем лучше, поскольку я хотел бы сделать код максимально компактным. Но самое главное, что это решает проблему. У меня Computed свойство currencyList () , которое собирается вернуть новый массив.

Заранее спасибо!

1 Ответ

0 голосов
/ 03 апреля 2019

Очень быстрое решение, о котором я подумал, было:

const accumulator = (array) => array.reduce((res, item) =>
              res.set(item.Currency, (res.get(item.Currency)||0) + item.Amount), new Map());

const values = Array.from(accumulator(array), item => ({item[0]: item[1]}))

Стоимость O (n), так что все в порядке. Вы можете, вероятно, претенциозировать его

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