Tengo un problema de filtrado..
objArray es la matriz que debe filtrarse. selectedNames es una matriz que contiene los valores que quiero encontrar en objArray. Necesito buscar todos los objetos que tienen uno o más valores de selectedNames en su propiedad "names" (una matriz).
La salida que estoy tratando de obtener es:
let result = [{names:["A","B","C","D"]}, {names:["A","B"]}, {names:["A","D"]} ]Aquí hay una versión simplificada de mi código:
let objArray = [{names:["A","B","C","D"]}, {names:["C","D"]}, {names:["C","D","E"]}, {names:["A","B"]}, {names:["A","D"]} ] let selectedNames = ["A","B"] result = this.objArray .filter(obj => { return this.selectedNames.includes(obj.names) }Mi código parece funcionar bien si el atributo de nombres era un valor único y no una matriz. Pero no puedo entender cómo hacer que funcione en una matriz.
Cualquier ayuda es más que bienvenida
Podrías hacer algo como esto. Filtrar la matriz en función de la propiedad de names que tiene un valor 'algún' incluido en la matriz de nombres seleccionados. ...
objArray.filter(obj => obj.names.some(name => selectedNames.includes(name)));[ Editar ] Como señaló @RadicalTurnip, esto no funciona si los nombres seleccionados son demasiado grandes. Te sugiero que uses un objeto. Ex
... const selectedNamesMap = selectedNames.reduce((p,c) => ({...p, [c]: true}), {}); objArray.filter(obj => obj.names.some(name => selelectedNamesMap[name]));Exagerado, pero si las matrices son realmente grandes (millones de elementos), entonces es mejor usar métodos regulares de bucle for y no de matriz.
Este resultado no tiene un rendimiento ampliado, pero no sé si hay alguna forma de garantizar que tendrá un rendimiento a menos que tenga más información (como que los nombres ya están ordenados). Dicho esto, solo te perdiste una pieza más de lógica.
result = this.objArray.filter(obj => { let toReturn = false; obj.names.forEach(name => { if (this.selectedNames.includes(name)) toReturn = true; }; }; return toReturn; };