Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

117
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!