[英]JavaScript: How to filter array by values nested in object 2 level deep
[英]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
30的accessArray
項目,該項目在示例中是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))
(這假設嵌套數組至少為空[]
並且它們都不是null
或undefined
)
我懷疑限制和用戶數組可以有多個元素,而不總是一個,所以你可以這樣做:
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.