¿Cómo filtrar una matriz de objetos por propiedad? por ejemplo, en esta matriz, si dos o más objetos tienen las mismas propiedades, como el nombre y el apellido , quiero eliminar cualquiera de ellos y dejar solo uno único en una matriz. ejemplo arr:
[ {name: "George", lastname: "GeorgeLast", age: 12}, {name: "George", lastname: "GeorgeLast", age: 13}, {name: "Bob", lastname: "GeorgeLast", age: 12}]el resultado debe ser cualquiera
[ {name: "George", lastname: "GeorgeLast", age: 13}, {name: "Bob", lastname: "GeorgeLast", age: 12}]o
[ {name: "George", lastname: "GeorgeLast", age: 12}, {name: "Bob", lastname: "GeorgeLast", age: 12}]Aplique la técnica que se muestra en esta respuesta , que es:
function onlyUnique(value, index, self) { return self.indexOf(value) === index; } ... pero usando findIndex con algunos criterios en lugar de solo indexOf .
let people = [ { name: "George", lastname: "GeorgeLast", age: 12 }, { name: "George", lastname: "GeorgeLast", age: 13 }, { name: "Bob", lastname: "GeorgeLast", age: 12 } ] let result = people.filter( (person, index) => index === people.findIndex( other => person.name === other.name && person.lastname === other.lastname )); console.log(result); En cuanto a si mantiene a George de 12 años o a George de 13 años, es una cuestión de cómo funciona findIndex , que resulta que devuelve el primer elemento coincidente. Entonces, en su caso de ejemplo, mantendrá a George, de 12 años.
Otra solución.
Aquí no necesita iterar a través de la lista n * n/2 veces (si cuento correctamente).
Por otro lado, este parece menos conciso y usa más memoria.
Usa el que prefieras.
const arr = [ {name: "George", lastname: "GeorgeLast", age: 12}, {name: "George", lastname: "GeorgeLast", age: 13}, {name: "Bob", lastname: "GeorgeLast", age: 12} ]; const obj = {} arr.forEach(v => { if (!obj[v.name]) { obj[v.name] = {} } if (!obj[v.name][v.lastname]) { obj[v.name][v.lastname] = v; } }) const result = []; Object.values(obj).forEach(nameObj => Object.values(nameObj).forEach(surnObj => result.push(surnObj)) ); console.log(result)