I want to filter out data from a multilayered JSON object:
var players = [
0:{
id: "1"
stats:
{
yellow_cards: "0"
saves: "0"
}
explain:
[
0:{
fixture: "251"
stats: [
0:{
identifier: "minutes"
points: "2"
value: "75"
}
]
}
1:{
fixture: "191"
stats:
[
0:{
identifier: "minutes"
points: "2"
value: "83"
}
1:{
identifier: "assists"
points: "3"
value: "1"
}
]
}
]
}
]
I want to sort out the players who have at least one object where identifier = "minutes" and the value is between 50 and 60. If I loop through everything it works fine:
var selected = [];
for(i=0; i<players.length; i++){
for(j=0; j<players[i].explain.length; j++){
for(k=0; k<players[i].explain[j].stats.length;k++){
if(players[i].explain[j].stats[k].identifier == "minutes"){
if(players[i].explain[j].stats[k].value >50 && players[i].explain[j].stats[k].value < 60) {
selected.push(players[i]);
}
}
}
}
}
This takes too much time, and I'm sure there is a more elegant way to do this with array filter and find function. Any help with this is highly appreciated.
Edit: In order to keep it short the array above shows only one object which doesn't fulfill the criteria.

selected = players.filter(({ explain }) => explain.some(({ stats }) => stats.some(({ identifier, value }) => ( identifier === 'minutes' && value > 50 && value < 60 ))));and share your feedback. It's pretty self-explanatory code - but if required, we can have an answer posted with explanations.