Вы можете сначала использовать 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'}));