Remove array of objects from another array of objects

Tags:



Assume we have the following arrays of objects to be compared based on property id:

a = [{'id':'1', 'name':'a1'}, {'id':'2', 'name':'a2'}, {'id':'3', 'name':'a3'}]

and

b = [[{'id':'2', 'name':'a2'}, ]

How can I subtract b from a? So that we have c = a - b which should be equal to [ {'id':'1', 'name':'a1'}, {'id':'3', 'name':'a3'}].

I have tried using this:

var c= a.filter(function(item) {
                    return !b.includes(item.id);
                });

but still not working.

Answer

How about this solution? It assumes that ‘b’ is also an array so for each element of ‘a’ you check if there is a matching object in ‘b’. If there is a matching object then return a false in the filter function so that that element is discarded.

var a = [{
  'id': '1',
  'name': 'a1'
}, {
  'id': '2',
  'name': 'a2'
}, {
  'id': '3',
  'name': 'a3'
}]
var b = [{
  'id': '2',
  'name': 'a2'
}]

var c = a.filter(function(objFromA) {
  return !b.find(function(objFromB) {
    return objFromA.id === objFromB.id
  })
})

console.log(c)


Source: stackoverflow