如何通过另一个对象过滤对象数组作为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)
我有一个对象数组
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)