简体   繁体   English

通过对象的嵌套数组布尔属性过滤对象数组

[英]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对象: truefalse 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM