¿Cómo comparar dos arrays y eliminar los objetos que sean iguales y retornar solo los que no se encuentren en uno de ellos?

publicado por: Anonymous

Justo como se hace en php (enlace) pero quisiera hacerlo en javascript.

_x000D_

_x000D_

var data1 = [{_x000D_
    "id": 1,_x000D_
    "nombre": "Mezcla"_x000D_
  },_x000D_
  {_x000D_
    "id": 6,_x000D_
    "nombre": "No Se"_x000D_
  },_x000D_
  {_x000D_
    "id": 5,_x000D_
    "nombre": "Etiquetado"_x000D_
  },_x000D_
  {_x000D_
    "id": 4,_x000D_
    "nombre": "Vaciado"_x000D_
  },_x000D_
  {_x000D_
    "id": 3,_x000D_
    "nombre": "Llenado"_x000D_
  },_x000D_
  {_x000D_
    "id": 2,_x000D_
    "nombre": "Esterilizacion"_x000D_
  }_x000D_
];_x000D_
_x000D_
console.log(data1);_x000D_
_x000D_
var data2 = [{_x000D_
    "id": 1,_x000D_
    "nombre": "Mezcla"_x000D_
  },_x000D_
  {_x000D_
    "id": 4,_x000D_
    "nombre": "Vaciado"_x000D_
  },_x000D_
  {_x000D_
    "id": 3,_x000D_
    "nombre": "Llenado"_x000D_
  },_x000D_
  {_x000D_
    "id": 2,_x000D_
    "nombre": "Esterilizacion"_x000D_
  }_x000D_
];_x000D_
_x000D_
console.log(data2);

_x000D_

_x000D_

_x000D_

Actualización 1:
Que de esos 2 arrays me retorne el siguiente:

_x000D_

_x000D_

var data3 = [{_x000D_
    "id": 6,_x000D_
    "nombre": "No Se"_x000D_
  },_x000D_
  {_x000D_
    "id": 5,_x000D_
    "nombre": "Etiquetado"_x000D_
  }_x000D_
];_x000D_
_x000D_
console.log(data3);

_x000D_

_x000D_

_x000D_

solución

Esto evidentemente se puede hacer con javascript puro pero, para trabajar con colecciones, ya hay herramientas archiprobadas como underscore y lodash.

La siguiente solución utiliza el método find de lodash.

_x000D_

_x000D_

var data1 = [{_x000D_
    "id": 1,_x000D_
    "nombre": "Mezcla"_x000D_
  },_x000D_
  {_x000D_
    "id": 6,_x000D_
    "nombre": "No Se"_x000D_
  },_x000D_
  {_x000D_
    "id": 5,_x000D_
    "nombre": "Etiquetado"_x000D_
  },_x000D_
  {_x000D_
    "id": 4,_x000D_
    "nombre": "Vaciado"_x000D_
  },_x000D_
  {_x000D_
    "id": 3,_x000D_
    "nombre": "Llenado"_x000D_
  },_x000D_
  {_x000D_
    "id": 2,_x000D_
    "nombre": "Esterilizacion"_x000D_
  }_x000D_
];_x000D_
_x000D_
_x000D_
var data2 = [{_x000D_
    "id": 1,_x000D_
    "nombre": "Mezcla"_x000D_
  },_x000D_
  {_x000D_
    "id": 4,_x000D_
    "nombre": "Vaciado"_x000D_
  },_x000D_
  {_x000D_
    "id": 3,_x000D_
    "nombre": "Llenado"_x000D_
  },_x000D_
  {_x000D_
    "id": 2,_x000D_
    "nombre": "Esterilizacion"_x000D_
  }_x000D_
];_x000D_
_x000D_
var data3=[];_x000D_
_x000D_
_.each(data1,function(objeto) {_x000D_
  _x000D_
  var elemento_en_data2 = _.find(data2,objeto);_x000D_
  _x000D_
  if(elemento_en_data2===undefined) {_x000D_
    data3.push(objeto);_x000D_
  }_x000D_
  _x000D_
});_x000D_
_x000D_
console.log(data3);

_x000D_

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

_x000D_

_x000D_

_x000D_

La principal dificultad de tu pregunta es que en javascript dos objetos no son iguales entre sí aunque tengan las mismas propiedades. Por lo mismo buscar la existencia de un determinado objeto usando el método indexOf

var posicion = data2.indexOf({"id": 2, "nombre": "Esterilizacion"});

Siempre dirá que el objeto no está en el array. Habría que implementar una función de igualdad que se cumpla cuando las propiedades enumerables de dos objetos coincidan, y luego recorrer en bucles anidados ambos arrays comprobando si hay elemento que cumplan con esa función custom. Prefiero no reinventar la rueda.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *