如何在javascript中过滤对象子数组和对象子数组数组
我有两个物体阵列。我想根据permissionObj筛选数据如何在javascript中过滤对象子数组和对象子数组数组,javascript,arrays,reactjs,object,functional-programming,Javascript,Arrays,Reactjs,Object,Functional Programming,我有两个物体阵列。我想根据permissionObj筛选数据 let permissionObj = [ { "Deposit": [{ label: "can create", value: "can_create" }, ] }, { "Journals":
let permissionObj = [
{
"Deposit": [{
label: "can create",
value: "can_create"
},
]
},
{
"Journals": [{
label: "can create",
value: "can_create"
}]
},
{
"Dashboard": [{
label: "can view",
value: "can_view"
}]
},
]
这是来自数据库。以下是permissionObj中的子数组
let permissionObj = [
{
"Deposit": [{
label: "can create",
value: "can_create"
},
]
},
{
"Journals": [{
label: "can create",
value: "can_create"
}]
},
{
"Dashboard": [{
label: "can view",
value: "can_view"
}]
},
]
这是静态数据。我想根据权限比较这些数据
const PubSidebar = [{
label: "Dashboard",
value: "can_view"
},
{
label: "OA deal",
content: [
{
label: "Deposit",
key: "Deposit",
value: "can_view"
},
{
label: "Corrections",
key: "Corrections",
value: "can_edit"
},
]
},
{
label: "Journal",
content: [{
label: "Add Journal",
key: "Journals",
value: "can_create"
},
]
},
];
这是我的PubSidebar,我需要三种类型的过滤
-如果pubSidebar是一个对象数组,那么它将根据标签进行过滤。对于examaple,请选择Dashboard
-如果是对象子数组的pubSidebar数组,则过滤将基于标签、键和值,例如PermissionObj键:将是属性名称,如OA交易、存款、值:can_view或任何内容
我的预期产出是:
const PubSidebar = [{
label: "Dashboard",
value: "can_view"
},
{
label: "OA deal",
content: [
{
label: "edit oadeal ",
key: "OA deal",
value: "can_edit"
},
{
label: "Deposit",
key: "Deposit",
value: "can_view"
},
]
},
{
label: "Journal",
content: [{
label: "Add Journal",
key: "Journals",
value: "can_create"
},
]
},
];
您可以使用reduce方法,因为它允许编写复杂的逻辑,并决定在数组的每次迭代中应该做什么。我稍微编辑了您的源数据,因为很难理解过滤的逻辑
首先,我们创建一个包含过滤器数据的对象。为什么反对?As对象具有O1访问其密钥的权限
const filterObject = permissionObj.reduce((a, c) => {
for (const key in c) {
a[key] = c[key];
}
return a;
},{});
然后我们使用reduce方法来决定数组元素是否有资格被推送:
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.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;
}, [])
例如:
设permissionObj=[
{
OA交易:[{
标签:可以查看,
值:can\u视图
}
]
}, {
存款:[{
标签:可以编辑,
值:可以编辑吗
},
]
},
{
存款:[{
标签:can_view,
值:can\u视图
},
]
},
{
期刊:[{
标签:可以创建,
价值:你能创造吗
}]
},
{
仪表板:[{
标签:可以查看,
值:can\u视图
}]
}
];
常量公共边栏=[
{
标签:仪表板,
值:can\u视图
},
{
标签:OA交易,
内容:[
{
标签:查看oadeal,
关键:OA交易,
值:can\u视图
},
{
标签:押金,
关键:存款,
值:can\u视图
},
{
标签:更正,
关键:更正,
值:可以编辑吗
},
]
},
{
标签:期刊,
内容:[{
标签:添加日志,
关键词:期刊,
价值:你能创造吗
},
]
},
];
常量过滤器对象=permissionObj.reducea,c=>{
对于c中的常量键{
a[键]=c[键];
}
返回a;
},{};
const result=PubSidebar.reducea,c=>{
如果过滤器对象[c.label]&&c.value
&&filterObject[c.label].somes=>s.value==c.value{
a、 PUSC;
}
否则,如果c.content.somes=>filterObject[s.key]&&c.content{
c、 content=c.content.filterf=>filterObject[f.key]
&&filterObject[f.key].somes=>s.value==f.value;
a、 PUSC;
}
返回a;
}, []
console.logresult;如果我想删除子数组属性-{label:view-oadeal,key:OA-deal,value:can\u-view},整个数组会删除吗?只需再次编辑。例如,如果我看到OA交易,将空数组存放在permissionobj中,然后OA交易从pubsidebar中移除。然而,如果存在存款或OA交易,它将保留在pubsidebar中。如何实现?sujon最好自己完成,因为这些要求将始终存在,并且您必须在stackoverflow创建新的帖子。所以,试着自己编写代码。真的很有趣。当人们看到你的尝试和一些可以理解的解释时,你会得到反馈。你已经很棒了!我相信你能做到这是你的灵感。谢谢,我正在努力do@sujon你好对不起,不过,我工作有点忙!我待会儿再看