JavaScript - 通过迭代另一个数组来过滤数组

时间:2018-02-16 11:16:18

标签: javascript ecmascript-6 iteration

第一个对象{array},我要过滤的那个:

const object1 = {
  "count" : 2,
  "result" : [
    { "id": 1 },
    { "id": 2 }
  ]
}

第二个数组:

const array2 = [{
 "id": 1,
 "id": 44
}]

如果object1.result等于object.result[i].id,我想过滤第一个数组array2[i].id(或创建一个除此之外的新数组),减少数组计数{{1基于过滤元素的数量。

在上面的示例中,我应该有一个新对象:

object1.count

2 个答案:

答案 0 :(得分:1)

您可以将filter()方法与find()方法结合使用:



const object1 = {
  count: 2,
  result: [
    { id: 1 },
    { id: 2 },
  ],
};

const array2 = [
  { id: 1 },
  { id: 4 },
];

const filteredResult = object1.result.filter(({ id }) => !array2.find(x => x.id === id));
const object3 = {
  count: filteredResult.length,
  result: filteredResult,
};
console.log(object3);




{ id }语法为destructuring assignment

您还可以使用reduce()



const object1 = {
  count: 2,
  result: [
    { id: 1 },
    { id: 2 },
  ],
};

const array2 = [
  { id: 1 },
  { id: 4 },
];

const object3 = object1.result.reduce(
  ({ count, result }, { id }) => array2.find(x => x.id === id)
    ? ({ count, result })
    : ({ count: count + 1, result: result.concat([{ id }]) }),
  { count: 0, result: [] },
);

console.log(object3);




答案 1 :(得分:1)

您可以使用Set全部收集id进行过滤。

var object = { count : 2, result : [{ id: 1 }, { id: 2 }] },
    array = [{ id: 1 }, { id: 44 }],
    ids = new Set(array.map(({ id }) => id));
    
object.result = object.result.filter(({ id }) => ids.has(id));
object.count = object.result.length;

console.log(object);

减少计数的方法。

var object = { count : 2, result : [{ id: 1 }, { id: 2 }] },
    array = [{ id: 1 }, { id: 44 }],
    ids = new Set(array.map(({ id }) => id));

object.result = object.result.filter(({ id }) => ids.has(id) || !object.count--);

console.log(object);