Tengo un problema que no puedo solucionar y me parece un poco extraño. Teniendo una lista de objetos foo , cada objeto tiene una propiedad de userId de usuario, quiero filtrar la lista para eliminar todos los elementos que contienen dicho userId de usuario que están en la matriz de bar . Usé los métodos filter() y some() , sin embargo, solo funcionan cuando la matriz de bar tiene solo un elemento. ¿De alguna manera some() impide que se ejecute todo el filtro cuando encuentra el primer elemento coincidente? Le agradecería que me explicara por qué esto no funciona.
Código de ejemplo:
let foo = [ { "userId": 1, }, { "userId": 2 }, { "userId": 3 }, { "userId": 4 } ]; let bar = [1, 2]; console.log(foo.filter(user => bar.some(id => id !== user.userId)));
Valor esperado:
[ { "userId": 3 }, { "userId": 4 } ]Pero obtuve:
[ { "userId": 1, }, { "userId": 2 }, { "userId": 3 }, { "userId": 4 } ]Su condición actualmente verifica si hay al menos un elemento en la matriz de barras que no sea el mismo que la matriz de elementos sobre la que está iterando . Eso será cierto para todos los artículos.
Debe verificar los elementos que existen usando some() y, en función de eso, devolver el valor inverso.
let foo = [ { "userId": 1, }, { "userId": 2 }, { "userId": 3 }, { "userId": 4 } ]; let bar = [1, 2]; console.log(foo.filter(user => !bar.some(id => id === user.userId)));simplemente puede usar métodos includes para verificar esta situación.
let foo = [ { "userId": 1, }, { "userId": 2 }, { "userId": 3 }, { "userId": 4 } ]; let bar = [1, 2]; // filter out for user IDs not in bar console.log(foo.filter(user => !bar.includes(user.userId)));para obtener más información sobre el método de inclusión: MDN
El método some() prueba si al menos un elemento de la matriz pasa la prueba.
Explicación de por qué some() no funciona aquí:
[1,2].some(id !== 1) devolverá true porque id 2 !== 1
[1,2].some(id !== 2) devolverá true porque id 1 !== 2
[1,2].some(id !== 3) devolverá true porque id 1 !== 3
[1,2].some(id !== 4) devolverá true porque id 1 !== 4