簡體   English   中英

如何基於嵌套數組 4 級深度過濾數組?

[英]How to filter an array based on a nested array 4 level deep?

我有一個這樣的對象:

let accessArray = [{
      id: 1,
      restrictions: [{
         canAccess: true,
         users: [{
            name: 'user',
            accessLevel: [10, 20, 30]
         }]
      }]
   },
   {
      id: 2,
      restrictions: [{
         canAccess: true,
         users: [{
            name: 'user2',
            accessLevel: [10, 20]
         }]
      }]
   }
]

我想知道如何過濾以僅獲取包含accessLevel 30accessArray項目,該項目在示例中是id = 1的項目。謝謝。

你可以寫一個嵌套的some

 const accessArray = [{id:1,restrictions:[{canAccess:true,users:[{name:'user',accessLevel:[10,20,30]}]}]},{id:2,restrictions:[{canAccess:true,users:[{name:'user2',accessLevel:[10,20]}]}]}] const level = 30; function getAccess(level) { return accessArray.filter(a => a.restrictions.some(b => b.users.some(c => c.accessLevel.includes(level)))) } console.log(getAccess(30))

(這假設嵌套數組至少為空[]並且它們都不是nullundefined

我懷疑限制和用戶數組可以有多個元素,而不總是一個,所以你可以這樣做:

 let accessArray = [{ id: 1, restrictions: [{ canAccess: true, users: [{ name: 'user', accessLevel: [10, 20, 30] }] }] }, { id: 2, restrictions: [{ canAccess: true, users: [{ name: 'user2', accessLevel: [10, 20] }] }] } ] let output = accessArray.filter( obj => obj.restrictions.some( restriction => restriction.users.some( user => user.accessLevel.includes(30) ) ) ) console.log(output)

在此示例中,如果任何用戶的訪問.some為 30,則返回 true。如果您需要所有用戶的訪問.some為 30,請將.some替換為.every

您可以迭代所有對象並查找所需的鍵,該值是一個數組,然后檢查該值,否則為所有其他找到的對象再次調用該函數。

這在不知道所需嵌套屬性的路徑的情況下起作用。 它適用於任何深度。

 const has = (key, value) => function iter(o) { return Object.entries(o).some(([k, v]) => k === key && Array.isArray(v) && v.includes(value) || v && typeof v === 'object' && iter(v) ); }; var array = [{ id: 1, restrictions: [{ canAccess: true, users: [{ name: 'user', accessLevel: [10, 20, 30] }] }] }, { id: 2, restrictions: [{ canAccess: true, users: [{ name: 'user2', accessLevel: [10, 20] }] }] }], result = array.filter(has('accessLevel', 30)); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

您可以使用 filter 函數只返回您想要的內容:

 let accessArray = [{ id: 1, restrictions: [{ canAccess: true, users: [{ name: 'user', accessLevel: [10, 20, 30] }] }] }, { id: 2, restrictions: [{ canAccess: true, users: [{ name: 'user2', accessLevel: [10, 20] }] }] } ] console.log(accessArray.filter(a => a.restrictions.some(b => b.users.some( c => c.accessLevel.includes(30)))))

這將檢查多個限制對象中的多個用戶

accessArray.filter(arr => {
    return arr.restrictions.filter(re => {
        return re.users.filter(user => user.accessLevel.includes(30)).length>0;
    }).length>0;
})

或者在一行中

accessArray.filter(arr => arr.restrictions.filter(re => re.users.filter(user => user.accessLevel.includes(30)).length>0).length>0)
accessArray.filter(arr => arr.restrictions.filter(re => re.users.filter(user => user.accessLevel.includes(30))))

暫無
暫無

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

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