Tengo un objeto con dos campos filter1 y filter2 que tienen valores en forma de matriz
let filter = {filter1:["mine","your"]: filter2:["C","D"]} //valores no fijos
los datos están en forma de matriz de objetos
let data = [ { id:1, filter1:["mine"], filter2:["E","C"]}, { id:2, filter1:["mine"], filter2:["E","C","F"]}, { id:3, filter1:["your"], filter2:["C"]}, { id:3, filter1:["your"], filter2:["D","C"]}, { id:5, filter1:["other"], filter2:["F"]}, ... ] Tengo que filtrar aquellos objetos que tienen alguno de los campos presentes en una clave específica, por ejemplo, si el filter es {filter1:["mine"]: filter2:["F","D"]} , primero buscará cualquier elemento de filter1 en filter1 del objeto de datos y luego busque cualquier elemento de filter2 que esté presente en el filter2 del objeto de datos y devuelva el objeto si se encuentra alguno
few example
resultado para {filter1:["mine"]: filter2:["F","D"]}
result = [ { id:1, filter1:["mine"], filter2:["E","C"]}, //since filter1 "mine" { id:2, filter1:["mine"], filter2:["E","C","F"]}, //since filter1 "mine" { id:3, filter1:["your"], filter2:["D","C"]}, //since from "F" and "D" from filter2 "D" is present { id:5, filter1:["other"], filter2:["F"]}, //since "F" from filter2 is present ] resultado para {filter1:["your"]: filter2:["F","G"]}
result = [ { id:2, filter1:["mine"], filter2:["E","C","F"]}, //since "F" from filter2 is present { id:3, filter1:["your"], filter2:["D","C"]}, //since filter1 is "your" { id:5, filter1:["other"], filter2:["F"]}, //since "F" from filter2 is present ] resultado para {filter1:[]: filter2:["D"]}
result = [ { id:3, filter1:["your"], filter2:["D","C"]}, //since filter2 has "D" ]Puede usar una combinación de .filter() , .some() e .includes() :
const data = [ { id:1, filter1:["mine"], filter2:["E","C"]}, { id:2, filter1:["mine"], filter2:["E","C","F"]}, { id:3, filter1:["your"], filter2:["C"]}, { id:3, filter1:["your"], filter2:["D","C"]}, { id:5, filter1:["other"], filter2:["F"]} ]; const search = ({ filter1, filter2 }) => data.filter(item => item.filter1.some(fItem => filter1.includes(fItem)) || item.filter2.some(fItem => filter2.includes(fItem)) ); const result = search({ filter1:["mine"], filter2:["F","D"] }); console.log(result);Puede generalizar la solución propuesta por RoMilton llamando a some() en Object.entries() del objeto de filtro pasado y luego iterando cada key y filter_array con llamadas anidadas a some() .
Si también Array#concat() la propiedad del elemento de datos iterado actualmente en una matriz, puede incluir propiedades que no sean de matriz en el objeto de filtro, es decir, id en este caso.
const data = [ { id: 1, filter1: ["mine"], filter2: ["E", "C"] }, { id: 2, filter1: ["mine"], filter2: ["E", "C", "F"] }, { id: 3, filter1: ["your"], filter2: ["C"] }, { id: 3, filter1: ["your"], filter2: ["D", "C"] }, { id: 5, filter1: ["other"], filter2: ["F"] } ]; const search = (array, filter_object) => array.filter(item => Object.entries(filter_object).some(([key, filter_array]) => [].concat(item[key]).some(fitem => filter_array.includes(fitem))) ); const filter = { filter1: ["mine"], filter2: ["F", "D"] }; const result = search(data, filter); console.log(...result.map(({ id }) => ({ id }))); const filter2 = { id: [5], filter1: ["mine"] } const result2 = search(data, filter2); console.log(...result2.map(({ id }) => ({ id }))); .as-console-wrapper { max-height: 100% !important; top: 0; } Este uso de concat() también se puede aplicar a la solución codificada para permitir propiedades que pueden no ser matrices en su matriz de datos.
const data = [ { id: 1, filter1: "mine", filter2: ["E", "C"] }, { id: 2, filter1: ["mine"], filter2: ["E", "C", "F"] }, { id: 3, filter1: ["your"], filter2: ["C"] }, { id: 3, filter1: ["your"], filter2: ["D", "C"] }, { id: 5, filter1: ["other"], filter2: ["F"] } ]; const search = ({ filter1, filter2 }) => ( data.filter(item => [].concat(item.filter1).some(fItem => filter1.includes(fItem)) || [].concat(item.filter2).some(fItem => filter2.includes(fItem)) )); const result = search({ filter1: ["mine"], filter2: ["F", "D"] }); console.log(result);