[英]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;
});
這是使用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.