arr = [{name: "tom", tools:["spanner", "hammer", "screwdriver"]}, {name: "john", tools:["Mallet", "hammer", "screwdriver"]}, {name: "phil", tools:["Mallet", "Drill", "screwdriver"]}] private filterObjectArray(arr: any, filterArr: any): any { return arr.filter((el: any) => filterArr.some( (f: any) => el.tools.toString()?.toLowerCase().indexOf(f.name?.toLowerCase()) >= 0 ) ); } Mi filtro es similar al anterior, en este momento si mi filtro devuelve filterArr = [{name: "screwdriver"}, {name: "hammer"}] entonces todos los objetos se devolverán ya que todos tienen al menos una coincidencia en screwdriver .
Sin embargo, ¿cómo hago para que solo se muestren los objetos que tienen ambas propiedades de filtro? Por ejemplo, en lo anterior, espero que solo regresen los dos objetos tom y john , ya que ambos tienen un screwdriver y un hammer , mientras que phil solo tiene un screwdriver .
Aquí hay una solución en JS. Puede usar every aquí para verificar si cada filtro está incluido en la matriz de herramientas
let arr = [{name: "tom", tools:["spanner", "hammer", "screwdriver"]}, {name: "john", tools:["Mallet", "hammer", "screwdriver"]}, {name: "phil", tools:["Mallet", "Drill", "screwdriver"]}] let filterArr = [{name: "screwdriver"}, {name: "hammer"}] let res = arr.filter(({tools}) => filterArr.every(({name}) => tools.includes(name))) console.log(res)Puede usar cada en lugar de include (índice> = 0)
Significa
private filterObjectArray(arr: any, filterArr: any): any { return arr.filter((el: any) => filterArr.every((f: any) => el.tools.includes(f.name))) }