Tengo una matriz de objetos que se parece a lo siguiente:
[ { id: 1234 name: Name1 }, { id: 5678 name: Name1 }, { id: 1234 name: Name1 }, { id: 5678 name: Name2 }, ]Quiero filtrar y eliminar los objetos que tienen la misma identificación Y el mismo nombre, por lo que el resultado esperado sería el siguiente:
[ { id: 1234 name: Name1 }, { id: 5678 name: Name1 }, { id: 5678 name: Name2 }, ]Sin embargo, solo puedo filtrar la matriz de objetos por ID único y no estoy seguro de cómo atender la condición adicional del mismo nombre:
data.filter((value, index, self) => { return ( self.findIndex((v) => v.id=== value.id) === index ); });Simplemente puede usar && para incluir criterios adicionales que deben cumplirse: en su ejemplo, desea que coincidan tanto la id como el name :
const filteredData = data.filter((value, index, self) => self.findIndex(v => v.id === value.id && v.name === value.name) === index ); Si tiene varias claves que desea considerar y no desea escribir varias declaraciones && , simplemente puede almacenar las claves en una matriz y luego usar Array.prototype.every() para hacer cumplir la coincidencia:
const keys = ['id', 'name']; const filteredData = data.filter((value, index, self) => self.findIndex(v => keys.every(k => v[k] === value[k])) === index );Vea la prueba de concepto a continuación:
const data = [{ id: 1234, name: 'Name1' }, { id: 5678, name: 'Name1' }, { id: 1234, name: 'Name1' }, { id: 5678, name: 'Name2' }, ]; const keys = ['id', 'name']; const filteredData = data.filter((value, index, self) => self.findIndex(v => keys.every(k => v[k] === value[k])) === index ); console.log(filteredData);Puede probar esta solución sencilla utilizando el método array.filter() junto con array.indexOf() y array.lastIndexOf()
Demostración de trabajo:
const obj = [ { id: 1234, name: 'Name1' }, { id: 5678, name: 'Name1' }, { id: 1234, name: 'Name1' }, { id: 5678, name: 'Name2' } ]; const res = obj.filter((item, index, obj) => obj.indexOf(item) && obj.lastIndexOf(item) ); console.log(res);Puede extender y agregar otra condición en su findIndex . Algo como esto
data.filter((value, index, self) => { return ( self.findIndex((v) => v.id === value.id && v.name === value.name) === index ); });Pero esto lleva mucho tiempo. Es mejor si crea un hash y lo usa para filtrar.
data.reduce( (acc, current) => { acc[`${current.name}#${current.id}`] = current; return acc }, {}).values() Lo que estoy haciendo aquí es crear una entrada para cada combinación única de name / id y luego solo obtener los valores de ese objeto.