У меня есть два массива вложенных объектов. Я хочу отфильтровать данные, основываясь на разрешении Obj.
Это исходит из базы данных. Вот массивы подмассивов в разрешении Obj.
Мне нужно выполнить другое условие в функции Reduce. Например, если значение Pubsidebar является токеном publi c, я хочу сохранить stati c content {label: "test", значение: "publi c"} без фильтрации с разрешениемObj, и если другой ключ и значение имеют значение сопоставьте с разрешением Obj, тогда внутри токена будет pu sh.
let permissionObj = [
{
'OA deal': [
{
label: 'can view',
value: 'can_view',
},
],
},
{
Deposit: [
{
label: 'can_view',
value: 'can_view',
},
],
},
{
Journals: [
{
label: 'can create',
value: 'can_create',
},
],
},
{
Dashboard: [
{
label: 'can view',
value: 'can_view',
},
],
},
{
token: [
{
label: 'can view',
value: 'can_create',
},
],
},
]
const PubSidebar = [
{
label: 'Dashboard',
value: 'can_view',
},{
label: 'transction',
value:"public",content:[{label:"test2",value:"public"}]
},
{
label: 'token',
value: 'public',
content: [
{
key: 'token',
value: 'can_create',
},
{
key: 'test',
value: 'public',
},
],
},
{
label: 'OA deal',
content: [
{
label: 'view oadeal',
key: 'OA deal',
value: 'can_view',
},
{
label: 'Deposit',
key: 'Deposit',
value: 'can_view',
},
{
label: 'Corrections',
key: 'Corrections',
value: 'can_edit',
},
],
},
{
label: 'Journals',
content: [
{
label: 'Add Journal',
key: 'Journals',
value: 'can_create',
},
],
},
]
const filterObject = permissionObj.reduce((a, c) => {
for (const key in c) {
a[key] = c[key]
}
return a
}, {})
const result = PubSidebar.reduce((a, c) => {
if (
filterObject[c.label] &&
c.value &&
filterObject[c.label].some(s => s.value === c.value)
) {
a.push(c)
} else if (c.value === 'public' && c.label === 'token') {
if (
(c.content = c.content.filter(
f =>
filterObject[f.key] &&
filterObject[f.key].some(s => s.value == f.value)
))
) {
c.content = c.content.filter(
f =>
filterObject[f.key] &&
filterObject[f.key].some(s => s.value == f.value)
)
a.push(c)
}
} else if (c.content.some(s => filterObject[s.key]) && c.content) {
c.content = c.content.filter(
f =>
filterObject[f.key] && filterObject[f.key].some(s => s.value == f.value)
)
a.push(c)
}
return a
}, [])
console.log(result)
Я пытаюсь получить публичные c данные с боковой панели без фильтрации с разрешением Obj.
мой ожидаемый результат будет:
[
{
"label": "Dashboard",
"value": "can_view"
},
{
label: 'transction',
value:"public",content:[{label:"test2",value:"public"}]
},
{
"label": "token",
"value": "public",
"content": [{
"key": "test",
"value": "public"
}
{
"key": "token",
"value": "can_create"
}
]
},
{
"label": "OA deal",
"content": [
{
"label": "view oadeal",
"key": "OA deal",
"value": "can_view"
},
{
"label": "Deposit",
"key": "Deposit",
"value": "can_view"
}
]
},
{
"label": "Journals",
"content": [
{
"label": "Add Journal",
"key": "Journals",
"value": "can_create"
}
]
}
]