Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

119
Vistas
¿Cómo filtrar una matriz de objetos por ID único y nombre único?

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 ); });
about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

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);

about 4 years ago · Juan Pablo Isaza Denunciar

0

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);

about 4 years ago · Juan Pablo Isaza Denunciar

0

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.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda