I have an array, which looks like this:
const persons = [
{
name: "Joe",
animals: [
{species: "dog", name: "Bolt"},
{species: "cat", name: "Billy"},
]
},
{
name: "Bob",
animals: [
{species: "dog", name: "Snoopy"}
]
}
];
Now I want to filter based on the species.
For example: every person which has a cat, should be returned:
const result = [
{
name: "Joe",
animals: [
{species: "dog", name: "Bolt"},
{species: "cat", name: "Billy"},
]
}
];
I have tried with the the filter() method like this:
const result = persons.filter(p => p.animals.filter(s => s.species === 'cat'))
But this doesn't return the desired result (it returns both persons).
How can I filter the array bases on an attribute of a nested array?
解决方案
Your inner filter still returns a "truthy" value (empty array) for the dog person. Add .length so that no results becomes 0 ("falsey")
const result = persons.filter(p => p.animals.filter(s => s.species === 'cat').length)
Edit: Per comments and several other answers, since the goal is to get a truthy value from the inner loop, .some would get the job done even better because it directly returns true if any items match.
const result = persons.filter(p => p.animals.some(s => s.species === 'cat'))
博客围绕ES6嵌套数组展开,给出一个包含人员及其动物信息的嵌套数组,需求是基于动物种类过滤数组。尝试用filter方法未得到预期结果,最终给出解决方案,可通过添加.length或使用some方法实现基于嵌套数组属性的过滤。
1336

被折叠的 条评论
为什么被折叠?



