按数量属性过滤对象数组

时间:2020-07-14 18:35:21

标签: javascript arrays

我需要获取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 个答案:

答案 0 :(得分:3)

由于您给出的示例在两个数组中使用了相同的索引,因此可以在第一个数组中进行映射,并对第二个数组进行索引比较,然后返回一个或另一个:

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

如果任一数组都可以大于另一个数组,则可以找到较大的数组,将其循环并与较小的数组进行比较,然后将对象添加到新数组中,直到到达末尾为止,然后从中添加其余对象较大的数组。

答案 1 :(得分:1)

您可以使用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);

答案 2 :(得分:1)

如果您知道两个数组都是根据内部对象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);

相关问题