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

256
Vistas
Eliminar objetos de matriz contenidos en otra matriz por valor

Tengo que eliminar todos los objetos de la matriz que contienen la misma identificación presente en otra matriz.

Este código funciona

 myArray = [{id: 1, value: 'a'}, {id: 2, value: 'b'}, {id: 3, value: 'c'}]; itemsToRemove = [{id: 2, value: 'x'}, {id: 3, value: 'y'}]; for (const item of itemsToRemove) { myArray.splice(myArray.findIndex(a => a.id === item.id), 1); }

pero estoy buscando una forma más elegante de hacerlo. yo tambien he probado

 const newArray = myArray.filter(a => itemsToRemove.findIndex(i => i.id === a.id));

pero no funciona. (crea una nueva matriz, pero al menos un elemento con la misma identificación permanece en la nueva matriz).

¿Hay una manera limpia y concisa de hacerlo?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Estás cerca, pero como dijo James en los comentarios, findIndex es la elección incorrecta porque devuelve -1 cuando no se encuentra el elemento. filter requiere que su predicado devuelva un boolean y -1 no es un boolean , por lo que está forzado a uno. Desafortunadamente, -1 es verdadero , lo que no coincide con su intención en el predicado.

Puede agregar una comparación para verificar que findIndex devolvió un valor menor que cero, o puede usar find o some :

 const myArray = [{id: 1, value: 'a'}, {id: 2, value: 'b'}, {id: 3, value: 'c'}]; const itemsToRemove = [{id: 2, value: 'x'}, {id: 3, value: 'y'}]; const newArray1 = myArray.filter(a => itemsToRemove.findIndex(i => i.id === a.id) < 0); console.log(newArray1); const newArray2 = myArray.filter(a => !itemsToRemove.find(i => i.id === a.id)); console.log(newArray2); const newArray3 = myArray.filter(a => !itemsToRemove.some(i => i.id === a.id)); console.log(newArray3);


Vale la pena señalar que find no es compatible con IE , ni findIndex . some es compatible con todos los navegadores , por lo que es el más compatible.

some es también el más eficaz:

Captura de pantalla de JSBench.me que muestra los resultados en la siguiente tabla

Prueba Resultado Operaciones/segundo
buscarÍndice 10,63% más lento 26632285
encontrar 12,39% más lento 26107649
alguno lo más rápido 29799972
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