[英]How to filtering between array of sub arrays and array of sub arrays in javascript?
我有兩個對象數組。 我想根據PermissionObj
過濾數據。
這是來自數據庫。 這是permissionObj
的子數組數組。
const PermissionObj = {
permission: [
{
books: [
{
label: "Can View",
value: "can_view"
}
]
},
{
Journals: [
{
label: "Can View",
value: "can_view"
},
{
label: "Can Create",
value: "can_create"
}
]
},
{
deal: [
{
label: "Can update",
value: "can_update"
},
{
label: "Can delete",
value: "can_delete"
}
]
}
]
}
這是靜態數據。 我想根據PermissionObj
比較這些數據。
const data = [
{
label: "books",
value: "can_view"
},
{
label: "deal",
content: [
{
value: "can_update"
},
{
value: "can_delete"
},
{ value: "can_view" }
]
},
{
label: "Articles"
},
{
label: "Journals",
content: [
{
value: "can_create"
},
{
value: "can_view"
},
{
value: "can_delete"
},
{
value: "can_edit"
}
]
}
]
我正在嘗試根據PermissionObj
對象數組過濾對象的數據數組。 這是我的嘗試代碼。
const permKeys = PermissionObj.permission.flatMap(item => Object.keys(item));
const filteredData = data.filter(({ label }) => permKeys.includes(label));
console.log(filteredData);
這是我的問題,我遇到的問題是,如果與期刊中的權限對象不匹配,我不想得到can_edit
、 can_delete
。 在我的權限對象中, can_delete
中沒有can_edit
和can_delete
。
我接受的輸出將是這種格式:
const data = [
{
label: "books",
value: "can_view"
},
{
label: "deal",
content: [
{
value: "can_update"
},
{
value: "can_delete"
}
]
},
{
label: "Journals",
content: [
{
value: "can_create"
},
{
value: "can_view"
}
]
}
]
可以使用reduce
方法並應用邏輯來決定應該推送哪些數據:
const result = data.reduce((a, c) => {
let filterObj = PermissionObj.permission.find(f => f[c.label]);
if (filterObj) {
if (c.value) {
a.push(c);
}
if (c.content) {
c.content = c.content.filter(f => filterObj[c.label]
.some(s => s.value.toLowerCase() == f.value.toLowerCase()));
a.push(c);
}
}
return a;
},[])
一個例子:
const PermissionObj = { permission: [ { "books": [ { "label": "Can View", "value": "can_view" } ] }, { "Journals": [ { "label": "Can View", "value": "can_view" }, { "label": "Can Create", "value": "can_create" } ] }, { "deal": [ { "label": "Can update", "value": "can_update" }, { "label": "Can delete", "value": "can_delete" } ] } ] }; const data = [ { label: "books", value: "can_view" }, { label: "deal", content: [ { value: "can_update" }, { value: "can_delete" }, { value:"can_view" } ] }, { label: "Articles", }, { label: "Journals", content: [ { value: "can_create" }, { value: "can_view" }, { value: "can_delete" }, { value: "can_edit" } ] } ]; const result = data.reduce((a, c) => { let filterObj = PermissionObj.permission.find(f => f[c.label]); if (filterObj) { if (c.value) { a.push(c); } if (c.content) { c.content = c.content.filter(f => filterObj[c.label].some(s => s.value.toLowerCase() == f.value.toLowerCase())); a.push(c); } } return a; },[]) console.log(result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.