javascript - 如何根据多个嵌套条件过滤对象?
问题描述
我有以下对象,我正在尝试根据多个标准过滤并返回两个组的玩家,例如“向我展示所有玩家,其中特许经营 = 漫威,权力 = 飞行”,但我被挂断了多个过滤级别。
我在看这个答案,但它似乎不适合我的场景:JavaScript - Filter object based on multiple values
如果我遍历这些组,我可以获得结果,但可能有很多组,我不想被挂断。不过,这是最好的方法吗?
oPlayers.players.groups.filter(function(hero){return hero.Id == 1})
oPlayers = {
"players": {
"groups": [
{
"Id": 1,
"hero": [
{
"Id": 1,
"name": "Batman",
"franchise": "DC",
"gender": "Male",
"powers": [{"power":"stealth"},{"power":"intelligence"},{"power":"weaponry"}]
},
{
"Id": 2,
"name": "Ironman",
"franchise": "Marvel",
"gender": "Male",
"powers": [{"power":"flight"},{"power":"intelligence"},{"power":"weaponry"}]
},
{
"Id": 3,
"name": "Supergirl",
"franchise": "DC",
"gender": "Female",
"powers": [{"power":"flight"},{"power":"strength"},{"power":"speed"}]
},
{
"Id": 4,
"name": "Valkyrie",
"franchise": "Marvel",
"gender": "Female",
"powers": [{"power":"flight"},{"power":"intelligence"},{"power":"strength"}]
}
]
},
{
"Id": 2,
"hero": [
{
"Id": 1,
"name": "Batwoman",
"franchise": "DC",
"gender": "Female",
"powers": [{"power":"stealth"},{"power":"intelligence"},{"power":"weaponry"}]
},
{
"Id": 2,
"name": "IronPepper",
"franchise": "Marvel",
"gender": "Female",
"powers": [{"power":"flight"},{"power":"intelligence"},{"power":"weaponry"}]
},
{
"Id": 3,
"name": "Superman",
"franchise": "DC",
"gender": "Male",
"powers": [{"power":"flight"},{"power":"strength"},{"power":"speed"}]
},
{
"Id": 4,
"name": "Thor",
"franchise": "Marvel",
"gender": "Male",
"powers": [{"power":"flight"},{"power":"intelligence"},{"power":"strength"}]
}
]
}
]
}
}
解决方案
您可以首先使用flatMap
获取所有玩家的单一列表。然后,假设您的条件被指定为一个对象,您可以根据every
指定的属性是否criteria
匹配玩家的属性来过滤玩家:
function filter(players, criteria) {
return players.players.groups.flatMap(({Id, hero}) =>
hero.filter(p =>
Object.entries(criteria).every(([k, v]) => {
if (k === 'power') return p.powers.some(({power}) => power === v);
return p[k] === v;
}))
.map(p => ({groupId: Id, ...p})));
}
const oPlayers = {
"players": {
"groups": [{
"Id": 1,
"hero": [{
"Id": 1,
"name": "Batman",
"franchise": "DC",
"gender": "Male",
"powers": [{
"power": "stealth"
}, {
"power": "intelligence"
}, {
"power": "weaponry"
}]
},
{
"Id": 2,
"name": "Ironman",
"franchise": "Marvel",
"gender": "Male",
"powers": [{
"power": "flight"
}, {
"power": "intelligence"
}, {
"power": "weaponry"
}]
},
{
"Id": 3,
"name": "Supergirl",
"franchise": "DC",
"gender": "Female",
"powers": [{
"power": "flight"
}, {
"power": "strength"
}, {
"power": "speed"
}]
},
{
"Id": 4,
"name": "Valkyrie",
"franchise": "Marvel",
"gender": "Female",
"powers": [{
"power": "flight"
}, {
"power": "intelligence"
}, {
"power": "strength"
}]
}
]
},
{
"Id": 2,
"hero": [{
"Id": 1,
"name": "Batwoman",
"franchise": "DC",
"gender": "Female",
"powers": [{
"power": "stealth"
}, {
"power": "intelligence"
}, {
"power": "weaponry"
}]
},
{
"Id": 2,
"name": "IronPepper",
"franchise": "Marvel",
"gender": "Female",
"powers": [{
"power": "flight"
}, {
"power": "intelligence"
}, {
"power": "weaponry"
}]
},
{
"Id": 3,
"name": "Superman",
"franchise": "DC",
"gender": "Male",
"powers": [{
"power": "flight"
}, {
"power": "strength"
}, {
"power": "speed"
}]
},
{
"Id": 4,
"name": "Thor",
"franchise": "Marvel",
"gender": "Male",
"powers": [{
"power": "flight"
}, {
"power": "intelligence"
}, {
"power": "strength"
}]
}
]
}
]
}
};
console.log(filter(oPlayers, {gender: 'Male', franchise: 'Marvel'}));
console.log(filter(oPlayers, {gender: 'Female', power: 'flight'}));
推荐阅读
- azure - 使用 Azure DevOps 部署 ShinyProxy 和应用程序
- mongodb - MongoDB 聚合查找不适用于 localfield _id
- django - 删除外键模型?
- r - 保存 .dta:使用 R 的带有很长字符串的数据框
- c# - 无法使用反射将方法组转换为非委托类型
- r - 在 split-apply-combine 中使用 map() 来运行具有回归权重的多个回归
- r - 在 ggplot2 log10 轴上以十的整数幂中断
- linux - 在linux(Jenkins)中的字符串匹配正则表达式之前添加新行
- python - 如何在自定义 DeleteView 中重定向到上一页?
- python-3.x - 如何准备python代码以在不同环境下从命令行运行?