首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据多个嵌套条件过滤对象?

如何根据多个嵌套条件过滤对象?
EN

Stack Overflow用户
提问于 2019-10-02 06:15:51
回答 1查看 50关注 0票数 0

我得到了以下对象,我正在尝试基于多个条件过滤和返回两个组的玩家,例如“显示所有玩家,其中特许经营=漫威,和power=飞行”,但我在多个级别的过滤挂起。

我一直在看这个答案,但它似乎不适合我的场景:JavaScript - Filter object based on multiple values

如果我遍历这些组,我可以得到结果,但可能有很多组,我不想被挂在那里。不过,这是最好的方法吗?

代码语言:javascript
复制
oPlayers.players.groups.filter(function(hero){return hero.Id == 1}) 
代码语言:javascript
复制
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"}]
                    }
                ]
            }
        ]
    }
}       
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-02 06:49:03

您可以首先使用flatMap获取所有玩家的单个列表。然后,假设您的条件被指定为对象,您可以根据criteria中指定的every属性是否与球员的属性匹配来过滤球员:

代码语言:javascript
复制
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'}));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58192941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档