簡體   English   中英

根據屬性值過濾嵌套的對象數組

[英]Filter nested array of objects based on a property value

嗨,我是 JavaScript 的新手,我有嵌套的對象數組,我的目標是過濾掉角色數組包含值的對象,例如“ _admin”' '可以是任何東西。 我的數據看起來像這樣

[
    {
        name:'tom',
        process:'flipkart',
        master:'pharma',
        profiles: [
            {
                level:'begginer',
                language:'hindi',
                role:['flp_admin','flp_teacher']
            }
        ]
    
    
    },
    {
        name:'jeo',
        process:'amazon',
        master:'science',
        profiles: [
            {
                level:'begginer',
                language:'english',
                role:['amz_admin']
            }
        ]
    
    
    },
    {
        name:'jerry',
        process:'email',
        master:'it',
        profiles: [
            {
                level:'begginer',
                language:'urdu',
                role:['eml_teacher']
            }
        ]
    
    }
]

任何人都可以告訴我如何過濾對象

代碼筆

 const data = [ { name: "tom", process: "flipkart", master: "pharma", profiles: [ { level: "begginer", language: "hindi", role: ["flp_admin", "flp_teacher"] } ] }, { name: "jeo", process: "amazon", master: "science", profiles: [ { level: "begginer", language: "english", role: ["amz_admin"] } ] }, { name: "jerry", process: "email", master: "it", profiles: [ { level: "begginer", language: "urdu", role: ["eml_teacher"] } ] } ]; const filterData = data.filter(({ profiles }) => { return profiles.filter(({ role }) => { return role.some(str => str.includes('_admin')) }).length }) console.log(filterData)

如果您不想使用任何庫(如 lodash),這可能是一種方法:

myArray.filter(item => item.profiles.some(p => /_admin/i.test(p.role)))

它將返回一個包含名稱為“tom”和“jeo”的對象的數組。

  • item.profiles.some(p => /_admin/i.test(p.role)) 指示是否有任何配置文件包含一個對象(項目)的“_admin”。

  • myArray.filter 會將與之前的 .some 條件匹配的所有對象(項目)返回為 true。

這是給你的單線,

data.filter(item => item.profiles.some((profile)=> profile.role.some((roleItem) => roleItem.includes('_admin'))))

這里的data是你的數組。

讓我為你分解一下,

data.filter((item) => {
    const itemHasRoleAdmin = item.profiles.some((profile) => {
       const profileHasRoleAdmin = profile.role.some((roleItem) => {
           if(roleItem.includes('_admin')) return true;
           else return false;
       });

       if(profileHasRoleAdmin) return true;
       else return false
    });

    if(itemHasRoleAdmin) return true;
    else return false;
});

有關Array.prototype.some 方法Array.prototype.filter 方法的更多信息

這是使用object-scan 的另一種解決方案。 一旦你了解如何使用它,它就會變得強大。 當庫使代碼更具可讀性和更易於維護時(例如,對於更改的需求),我非常喜歡使用庫

 // const objectScan = require('object-scan'); const filter = (data) => objectScan(['[*].profiles[*].role'], { filterFn: ({ parents, value, context }) => { if (value.some((role) => role.endsWith('_admin'))) { context.push(parents[parents.length - 2]); return true; } return false; } })(data, []); const data = [{ name: 'tom', process: 'flipkart', master: 'pharma', profiles: [{ level: 'begginer', language: 'hindi', role: ['flp_admin', 'flp_teacher'] }] }, { name: 'jeo', process: 'amazon', master: 'science', profiles: [{ level: 'begginer', language: 'english', role: ['amz_admin'] }] }, { name: 'jerry', process: 'email', master: 'it', profiles: [{ level: 'begginer', language: 'urdu', role: ['eml_teacher'] }] }]; console.log(filter(data)); // => [ { name: 'jeo', process: 'amazon', master: 'science', profiles: [ { level: 'begginer', language: 'english', role: [ 'amz_admin' ] } ] }, { name: 'tom', process: 'flipkart', master: 'pharma', profiles: [ { level: 'begginer', language: 'hindi', role: [ 'flp_admin', 'flp_teacher' ] } ] } ]
 .as-console-wrapper {max-height: 100% !important; top: 0}
 <script src="https://bundle.run/object-scan@13.8.0"></script>

免責聲明:我是對象掃描的作者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM