首页 > 解决方案 > 比较两个数组并通过对象 id javascript 删除对象

问题描述

我尝试过的代码是:

    const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
    const sasas = [];
    const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
    data2.map((io) => {
     sasas.push(io.id);
     });
    
    sasas.forEach((ik) => {
     for (let i = 0; i < data1.length - 1; i++) {
       if (data1[i].id === ik) {
          data1.splice(i, 1);
            }
          }
      });
    console.log(data1);

我有两个数组,我将data2数据映射并获取 id 值到sasas中。

然后对于每个 sasas数据,

并使用 forloop拼接data1的索引数据。

然后得到的答案是 id :1 , id:3, id:5 中的对象data1

但我的预期输出是:

const data1 = [{ id: 1, name: 'dd' },{ id: 3, name: 'dd' }];

请帮我 !

标签: javascriptarraysjsonobject

解决方案


尝试这个

data1.filter(x=> !data2.some(y=> y.id==x.id ))

const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];

let result = data1.filter(x=>!data2.some(y=>y.id==x.id))

console.log(result);

上述短解的时间复杂度为O(n*m),低于 O(n+m)版本(n,m 是数组长度):

let h = {}; data2.map(x=>h[x.id]=1); 
let result = data1.filter(x=>!h[x.id]);

const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];

let h = {}; data2.map(x=>h[x.id]=1);     // we use hash map with data2 ids
let result = data1.filter(x=>!h[x.id]);

console.log(result);


推荐阅读