我正在尝试通过此处的另一个对象过滤对象列表示例
// the list need to be filtered
const list = [
{
"id": 1,
"name": "Loraine Mueller",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/BroumiYoussef/128.jpg",
"status": "offline",
"language": "German",
"rating": 4,
"reviews": 4308
},
{
"id": 2,
"name": "Katarina Kilback",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/dvdwinden/128.jpg",
"status": "online",
"language": "German",
"rating": 5,
"reviews": 8484
}
]
const filterBy = {
status: {
online: true,
offline: false
},
language: {
english: true,
german: false
}
}
实现 _filterList(list, filterBy) 的想法:返回包含在线和德国项目的过滤列表
我尝试了什么
const _filter = (rows, filterBy) => {
let result = [...rows];
Object.keys(filterBy)
.map(key => result = [...result.filter(row => filterBy[key].includes(row[key]))]);
return result;
}
最佳答案
假设您想要的结果是给定的过滤器键是列表中的任何值,则为 filter
/every
/includes
的组合> 诀窍是:
const list = [
{
id: 1,
name: "Loraine Mueller",
status: "offline",
language: "German",
rating: 4,
reviews: 4308,
},
{
id: 2,
name: "Katarina Kilback",
status: "online",
language: "German",
rating: 5,
reviews: 8484,
},
];
function filterBy(list, filters) {
return list.filter(ent =>
Object.keys(filters).every(filterKey =>
filters[filterKey].includes(ent[filterKey]),
),
);
}
console.log(
filterBy(list, {
status: ["online"],
language: ["German"],
}),
);
仅输出卡特琳娜。
编辑:根据评论,我们还需要将过滤器对象转换为这种形状。当然可以。
function transformFilters(filterBy) {
const transformedFilters = {};
for (var key in filterBy) {
const values = [];
for (var value in filterBy[key]) {
if (filterBy[key][value]) {
values.push(value);
}
}
if (values.length) {
transformedFilters[key] = values;
}
}
return transformedFilters;
}
console.log(
transformFilters({
status: {
online: true,
offline: false,
},
language: {
english: true,
german: false,
},
}),
);
输出
{ status: [ 'online' ], language: [ 'english' ] }
关于javascript - 通过另一个 true 标记的子键对象过滤对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57884467/