从对象数组中删除相同的值

我要通过比较2个数组从数组中删除同一对象。

示例数据:

arr1 = [
  {id: 1, name: "a"},
  {id: 2, name: "b"},
  {id: 3, name: "c"},
  {id: 4, name: "d"},
];

arr2 = [
  {id: 1, name: "a"},
  {id: 4, name: "d"},
];

let newArray = []; // new array with with no same values it should be unique.
arr1.map((val, i)=>{
   arr2.map((val2)=>{
    if(val.id == val2.id){
       console.log('Matched At: '+ i) // do nothing
    }else{
      newArray.push(val);
    }
   })
})
console.log(newArray); // e.g: [{id: 2, name: "b"}, {id: 3, name: "c"},];

解决方案

Array.filter与NOTArray.some组合。

这里的诀窍也是不要some,..

const arr1 = [
  {id: 1, name: "a"},
  {id: 2, name: "b"},
  {id: 3, name: "c"},
  {id: 4, name: "d"},
], arr2 = [
  {id: 1, name: "a"},
  {id: 4, name: "d"},
];

const newArray=arr1.filter(a=>!arr2.some(s=>s.id===a.id));

console.log(newArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }

正如评论中提到的,这个问题可以稍有不同地解释。如果您还想要arr2中的unquue项,基本上只需执行两次并加入即可。IOW:检查arr1中不在arr2中的内容,然后检查arr2中不在arr1中的内容。

例如..

const notIn=(a,b)=>a.filter(f=>!b.some(s=>f.id===s.id));
const newArray=[...notIn(arr1, arr2), ...notIn(arr2, arr1)];
更新2: 时间复杂性,正如qAlex提到的,循环中有循环。虽然some在查找匹配时会出现短路,但如果数据集变大,则可能会减慢速度。这是SetMap传入。

因此,若要使用Set修复此问题,请执行以下操作。

const notIn=(a,b)=>a.filter(a=>!b.has(a.id));
const newArray=[
  ...notIn(arr1, new Set(arr2.map(m=>m.id))),
  ...notIn(arr2, new Set(arr1.map(m=>m.id)))
];

相关文章