简体   繁体   English

如何根据多个嵌套条件过滤 object?

[英]How do I filter an object based on multiple nested criteria?

I've got the following object and I'm trying to filter and return players from both groups based on multiple criteria such as "show me all players where franchise = Marvel, and power= flight" but I'm getting hung up in multiple levels of filtering.我有以下 object 并且我正在尝试根据多种标准过滤并返回两组玩家过滤级别。

I was looking at this answer but it doesn't seem to fit my scenario: JavaScript - Filter object based on multiple values我在看这个答案,但它似乎不适合我的场景: JavaScript - Filter object based on multiple values

I can get results if I iterate over the groups but there are potentially lots of groups and I didn't want to get hung up in that.如果我遍历这些组,我可以获得结果,但可能有很多组,我不想被挂断。 Is that the best way, though?不过,这是最好的方法吗?

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

You can first use flatMap to get a single list of all players.您可以首先使用flatMap获取所有玩家的单个列表。 Then, given that your criteria is specified as an object, you can filter players based on whether every property specified in criteria matches properties of a player:然后,假设您的条件被指定为 object,您可以根据criteria中指定的every属性是否与玩家的属性匹配来过滤玩家:

 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'}));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM