从ListA删除ListB-逻辑

时间:2019-04-11 00:07:11

标签: javascript typescript

我有2个列表对象,需要从包含ListB的ListA中删除所有项目,并返回其余的项目。我的方法如下:

列表A

[{
    "id": 1,
    "name": "ant"
}, {
    "id": 2,
    "name": "ant2"
}, {
    "id": 3,
    "name": "ant3"
}, {
    "id": 4,
    "name": "ant3"
}, {
    "id": 5,
    "name": "ant3"
}]

列表B

[{
    "id": 1,
    "name": "ant"
}, {
    "id": 4,
    "name": "ant4"
}, {
    "id": 3,
    "name": "ant3"
} ]

我尝试过的事情:

const xxx = this.listA.filter(x => !listB.includes(x) != null);

注意(替代方案):当存在2个相同的List时,预期结果为[]。但是,就我而言,它与单个列表相同。

2 个答案:

答案 0 :(得分:2)

您在这里:)

const listBSerialized = listB.map(x => JSON.stringify(x)) 
const xxx = listA.filter(x => !listBSerialized.includes(JSON.stringify(x)));

您将得到以下结果:

[ { id: 2, name: 'ant2' },
  { id: 4, name: 'ant3' },
  { id: 5, name: 'ant3' } ]

您还可以在需要序列化时需要属性顺序保证的情况下使用模型,有时对象可以具有相同的属性,但顺序不同(取决于对象来自何处):

function Ant(id, name) {
  this.id = id
  this.name = name
}

listA = [
  new Ant(1, "ant"),
  new Ant(2, "ant2"),
  new Ant(3, "ant3"),
  new Ant(4, "ant3"),
  new Ant(5, "ant3")
]

listB = [
  new Ant(1, "ant"),
  new Ant(4, "ant4"),
  new Ant(3, "ant3")
]

const listBSerialized = listB.map(x => JSON.stringify(x)) 
const xxx = listA.filter(x => !listBSerialized.includes(JSON.stringify(x)));

答案 1 :(得分:1)

这是一个可以完成此任务的简单班轮:

const xxx = listA.filter(base => ! listB.some(f => f.id === base.id && f.name === base.name))

其中a是ListA,而b是对象的ListB数组。基本上,您要做的就是过滤a数组,条件是b数组中没有对象具有相同的ID和名称。