如何在javascript中过滤对象子数组和对象子数组数组

如何在javascript中过滤对象子数组和对象子数组数组,javascript,arrays,reactjs,object,functional-programming,Javascript,Arrays,Reactjs,Object,Functional Programming,我有两个物体阵列。我想根据permissionObj筛选数据 let permissionObj = [ { "Deposit": [{ label: "can create", value: "can_create" }, ] }, { "Journals":

我有两个物体阵列。我想根据permissionObj筛选数据

 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你好对不起,不过,我工作有点忙!我待会儿再看