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?
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:
| 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 |