Search code examples
javascriptarraysjsonloopsjavascript-objects

Remove same Values from array of Object


I want to remove same object from array by comparing 2 arrays.

Sample Data:

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"},];

Solution

  • Array.filter combined with not Array.some.

    The trick here is also to not 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; }

    As mentioned in comments the question could be interpreted slightly differently. If you also want the unqiue items from arr2, you basically just do it twice and join. IOW: check what not in arr2 is in arr1, and then check what not in arr1 that's in arr2.

    eg..

    const notIn=(a,b)=>a.filter(f=>!b.some(s=>f.id===s.id));
    const newArray=[...notIn(arr1, arr2), ...notIn(arr2, arr1)];
    

    Update 2: Time complexity, as mentioned by qiAlex there is loops within loops. Although some will short circuit on finding a match, if the dataset gets large things could slow down. This is were Set and Map comes in.

    So to fix this using a 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)))
    ];