Tengo una variedad de objetos.
let allData = [ {title:"Adams",age:24,gender:"male"}, {title:"Baker",age:24,gender:"female"}, {title:"Clark",age:23,gender:"male"}, {title:"Davis",age:23,gender:"female"}, {title:"Ghosh",age:23,gender:"female"}, {title:"Adams",age:23,gender:"male"}, {title:"Irwin",age:25,gender:"male"}, ]y lista de filtros en un objeto como este
let filters = { title:{filterTerm:[]}, gender:{filterTerm:["male"]}, age:{filterTerm:[23]} }Quiero aplicar varios filtros encima de todos los datos. Intenté usar Array.some con Array.includes, pero no funciona cuando con varios elementos de filtros a continuación está mi código.
const getFilterRows = (rows, filters) => { let filterCols = Object.keys(filters) if (filterCols.length == 0) { return rows } else { let filteredR = rows.filter(i => { return filterCols.some((s) => { return filters[s].filterTerm.includes(i[s]) }) }); return filteredR } } let filterd = getFilterRows(allData,filters)Rendimiento esperado
[ {title:"Clark",age:23,gender:"male"}, {title:"Adams",age:23,gender:"male"}, ]Puede asignar cada clave de los filters y filtrar todos los datos en filterTerm allData el elemento que se busca, ignorando el filtro si filterTerm está vacío. El siguiente ejemplo también le permitiría agregar más elementos a filterTerm si es necesario.
let allData = [ {title:"Adams",age:24,gender:"male"}, {title:"Baker",age:24,gender:"female"}, {title:"Clark",age:23,gender:"male"}, {title:"Davis",age:23,gender:"female"}, {title:"Ghosh",age:23,gender:"female"}, {title:"Adams",age:23,gender:"male"}, {title:"Irwin",age:25,gender:"male"} ] let filters = { title:{filterTerm:[]}, gender:{filterTerm:["male"]}, age:{filterTerm:[23]}, } const getFilterRows = (rows, filters) => { return rows.filter(row => ( Object.keys(filters) .map(key => filters[key].filterTerm.length ? filters[key].filterTerm.includes(row[key]) : true) .every(Boolean)) ) } let filtered = getFilterRows(allData,filters) console.log(filtered)