[英]Filter array of object by nested array of object boolean property
const Person = [
{
firstname: "john",
lastname: "doe",
items: [
{
visible: true,
foo: "bar"
},
{
visible: false,
foo: "bar"
}
]
},
{
firstname: "jane",
lastname: "doe",
items: [
{
visible: false,
foo: "bar"
}
]
},
{
firstname: "john",
lastname: "adam",
items: [
{
visible: true,
foo: "bar"
},
{
visible: false,
foo: "bar"
}
]
},
]
In the above array of Person
objects, i have an array of items
objects that has a property visible
. 另外,在上述的阵列Person
对象,我有数组items
具有属性的对象visible
。 I'm trying to filter Person
object based on the visible
field: true
or false
. 我试图根据visible
字段过滤Person
对象: true
或false
。 The filtered Person object's items array of object will only hold true or false as well. 过滤后的Person对象的items数组对象也将仅包含true或false。 How can I achieve this? 我该如何实现?
I have tried: 我努力了:
I tried: 我试过了:
const filteredPerson = Person.filter(person => {
person.items.filter(item => item.visible === true)
})
Use Array.some 使用Array.some
const Person = [{firstname: "john",lastname: "doe",items: [{visible: true,foo: "bar"}]},{firstname: "jane",lastname: "doe",items: [{visible: false,foo: "bar"}]},{firstname: "john",lastname: "adam",items: [{visible: true,foo: "bar"}]}]; // Filters all those objects in Person array which has atleast one visible item const result = Person.filter(v => v.items.some(o => o.visible)); console.log(result);
EDIT (Use nested Array.filter) 编辑 (使用嵌套的Array.filter)
const Person = [{firstname: "john",lastname: "doe",items: [{visible: true,foo: "bar"},{visible: false,foo: "bar"}]},{firstname: "jane",lastname: "doe",items: [{visible: false,foo: "bar"}]},{firstname: "john",lastname: "adam",items: [{visible: true,foo: "bar"},{visible: false,foo: "bar"}]}]; // Filters all those objects in Person array which has atleast one visible item const result = Person.filter(v => { const filteredItems = v.items.filter(o => o.visible); if(filteredItems.length) { // if there is any visible item v.items = filteredItems; return true; } }); console.log(result);
Single filter()
is enough here. 这里仅使用filter()
就足够了。 Since the visible property in item is at 0 index you can use the that index: 由于item中的visible属性位于0索引处,因此可以使用该索引:
const Person = [{firstname: "john",lastname: "doe",items: [{visible: true,foo: "bar"}]},{firstname: "jane",lastname: "doe",items: [{visible: false,foo: "bar"}]},{firstname: "john",lastname: "adam",items: [{visible: true,foo: "bar"}]}]; const filteredPerson = Person.filter(person => person.items[0].visible) console.log(filteredPerson);
If the property index is not known then you have to use some()
inside filter()
. 如果属性索引未知,则必须在filter()
内使用some()
filter()
。 You can use map()
to return the specific property from objects in the array: 您可以使用map()
从数组中的对象返回特定属性:
const Person = [{firstname: "john",lastname: "doe",items: [{visible: true,foo: "bar"}]},{firstname: "jane",lastname: "doe",items: [{visible: false,foo: "bar"}]},{firstname: "john",lastname: "adam",items: [{visible: true,foo: "bar"}]}]; const filteredPerson = Person.filter(person => person.items.some(s =>s.visible)).map(p => ({items: p.items})); console.log(filteredPerson);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.