Фильтровать массив объектов по свойству количества - PullRequest
1 голос
/ 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}];

Я пробовал вот так:

console.log(arr2.filter(x => x.amount > arr1[x].amount));

Ответы [ 3 ]

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

Поскольку в приведенном вами примере используется один и тот же индекс в обоих массивах, вы можете сопоставить первый массив и индексировать второй массив и вернуть тот или иной:

var res = arr1.map((v, index) => v.amount > arr2[index].amount ? v : arr2[index]);

Если один из массивов может быть больше другого, вы можете найти больший массив, l oop через него, сравнить его с меньшим и добавить объекты в новый массив, пока не дойдете до конца, а затем добавить оставшиеся объекты из большего массива.

1 голос
/ 14 июля 2020

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

Примечание: Если вы имеете дело с массивами разных размеров, вам придется фильтровать или перебрать оба массива.

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

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

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

let actualOutput = arr1.map((ele1) => {
  let ele2 = arr2.find((e) => e.name === ele1.name);
  if(ele2) {
    if(ele2.amount >= ele1.amount) {
      return ele2;
    }
  }
  return ele1;
});

console.log("actual: ", actualOutput);
console.log("expected: ", expectedOutput);
1 голос
/ 14 июля 2020

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

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

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

let res = arr1.map((curr,idx)=>curr.amount > arr2[idx].amount?curr:arr2[idx]);
console.log(res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...