Supongamos que tenemos las siguientes matrices de objetos para comparar en función de la propiedad id:

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

Y

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

¿Cómo puedo restar b de a? Para que tengamos c = a - b que debería ser igual a [ {'id':'1', 'name':'a1'}, {'id':'3', 'name':'a3'}].

He intentado usar esto:

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

Pero aún no funciona.

4
Codec 30 oct. 2017 a las 17:30

3 respuestas

La mejor respuesta

¿Qué tal esta solución? Se supone que 'b' también es una matriz, por lo que para cada elemento de 'a' verifica si hay un objeto coincidente en 'b'. Si hay un objeto coincidente, devuelve un falso en la función de filtro para que ese elemento se descarte.

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)
8
John 30 oct. 2017 a las 14:38

Primero, crea solo un mapa de los identificadores que desea eliminar. Luego, filtras tu primera matriz con ella, así:

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

var idsToDelete = b.map(function(elt) {return elt.id;});
var result = a.filter(function(elt) {return idsToDelete.indexOf(elt.id) === -1;});
console.log(result)
1
sjahan 30 oct. 2017 a las 14:52

Aquí hay una buena respuesta de una línea :)

Básicamente, puede filtrar, como ya intentaba hacer. Entonces también puede filtrar b para cada elemento a y si la longitud de la b filtrada es cero, entonces devuelve verdadero porque eso significa que un elemento es único para a.

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

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

c = a.filter( x => !b.filter( y => y.id === x.id).length);
console.log(c);
5
crypto_rob 30 oct. 2017 a las 15:11