如何通过另一个对象过滤对象数组作为JS中的键?

how to filter a array of object by another object as key in JS?

我有一个对象数组

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]}
}

我想在 allData 上应用多个过滤器我尝试将 Array.some 与 Array.includes 一起使用,但是当下面的多个过滤器项目是我的代码时它不起作用

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)

预期输出

[  
 {title:"Clark",age:23,gender:"male"},
 {title:"Adams",age:23,gender:"male"},
]

您可以映射 filters 中的每个键并根据 filterTerm 是否包含正在搜索的项目来过滤 allData,如果 filterTerm 为空则忽略过滤器。如果需要,下面的示例还允许您向 filterTerm 添加更多项目。

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)