我有一个数组,如下所示:
const persons = [
{
name: "Joe",
animals: [
{species: "dog", name: "Bolt"},
{species: "cat", name: "Billy"},
]
},
{
name: "Bob",
animals: [
{species: "dog", name: "Snoopy"}
]
}
];
现在我想根据物种进行过滤。 例如:每个有猫的人都应该被退回:
const result = [
{
name: "Joe",
animals: [
{species: "dog", name: "Bolt"},
{species: "cat", name: "Billy"},
]
}
];
我尝试过这样的filter()
方法:
const result = persons.filter(p => p.animals.filter(s => s.species === 'cat'))
但这不会返回所需的结果(它会返回两个人)。
如何在嵌套数组的属性上过滤数组?
答案 0 :(得分:11)
你的内部过滤器仍然会返回一个" truthy"狗人的价值(空数组)。添加.length
,以便结果不会变为0
(" falsey")
const result = persons.filter(p => p.animals.filter(s => s.species === 'cat').length)
编辑:根据评论和其他几个答案,由于目标是从内部循环中获取真值,.some
会更好地完成工作,因为它直接返回true如果有任何项目匹配。
const result = persons.filter(p => p.animals.some(s => s.species === 'cat'))
答案 1 :(得分:2)
您可能想要使用一些'
persons.filter(p => p.animals.some(s => s.species === 'cat'))
答案 2 :(得分:1)
const persons = [
{
name: "Joe",
animals: [
{species: "dog", name: "Bolt"},
{species: "cat", name: "Billy"},
]
},
{
name: "Bob",
animals: [
{species: "dog", name: "Snoopy"}
]
}
];
Filter = function(arr, a){
return arr.filter(t=>t.animals.filter(y=>y.species==a).length>0);
}
console.log(Filter(persons, 'cat'))

答案 3 :(得分:0)
您可以使用filter()
和some()
方法检查动物数组中的某些对象是否有species == cat
。
const persons = [{"name":"Joe","animals":[{"species":"dog","name":"Bolt"},{"species":"cat","name":"Billy"}]},{"name":"Bob","animals":[{"species":"dog","name":"Snoopy"}]}]
const result = persons.filter(({animals}) => {
return animals.some(({species}) => species == 'cat')
})
console.log(result)
答案 4 :(得分:0)
这应该可以解决问题
persons.filter((person) => {
return person.animals.filter((animal) => {
return animal.species === 'cat';
}).length > 0;
});
添加长度检查,因为过滤器返回一个数组,而不是布尔值。
答案 5 :(得分:0)
您没有检查第二个过滤器的长度。
Filer仅包含返回true
值的结果。所以我们需要为第二个过滤器提供一种如果找到某些东西则返回true的方法。我们可以这样说,如果返回的数组是> 0
const persons = [
{
name: "Joe",
animals: [
{species: "dog", name: "Bolt"},
{species: "cat", name: "Billy"},
]
},
{
name: "Bob",
animals: [
{species: "dog", name: "Snoopy"}
]
}
];
const filtered = persons.filter(p => p.animals.filter(a => a.species === "cat").length > 0)
console.log(filtered)

答案 6 :(得分:0)
这应该有效!
const result = persons.filter(person => {
let innerResult = person.animals.filter(animal => {
return animal.species === 'cat';
});
return innerResult.length > 0;
});