es6 嵌套数组循环,JS(ES6):根据嵌套数组属性过滤数组

博客围绕ES6嵌套数组展开,给出一个包含人员及其动物信息的嵌套数组,需求是基于动物种类过滤数组。尝试用filter方法未得到预期结果,最终给出解决方案,可通过添加.length或使用some方法实现基于嵌套数组属性的过滤。

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'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值