Любой способ решить эту проблему без объединения этих двух массивов? - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно получить массив expectedOutput, который состоит из объектов с большим номером суммы. Этот код объединяет два массива, а затем уменьшает их на большее количество. Я ищу лучший способ сделать это без конкатенации. Заранее спасибо.

let arr1 = [{name: 'Almendras', amount: 0},{name: 'Nueces', amount: 0}, {name: 'Chocolate', amount: 0}];
let arr2 = [{name: 'Almendras', amount: 2}];

let expectedOutput = [{name: 'Almendras', amount: 2}, {name: 'Nueces', amount: 0}, {name: 'Chocolate', amount: 0}];

let concat = arr1.concat(arr2);

const output = Object.values(concat.reduce((x, y) => {
  x[y.name] = x[y.name] && x[y.name].amount > y.amount ? x[y.amount] : y
  return x
}, {}));

console.log(output);

1 Ответ

4 голосов
/ 14 июля 2020

Вы можете избежать вызова concat, запустив reduce для обоих массивов по отдельности:

let arr1 = [{name: 'Almendras', amount: 0},{name: 'Nueces', amount: 0}, {name: 'Chocolate', amount: 0}];
let arr2 = [{name: 'Almendras', amount: 2}];

function mergeHigher(acc, el) {
  const old = acc[el.name];
  if (!old || el.amount >= old.amount) acc[el.name] = el;
  return acc;
}

const out1 = arr1.reduce(mergeHigher, {});
const out2 = arr2.reduce(mergeHigher, out1);

console.log(Object.values(out2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...