繁体   English   中英

按属性组合对象数组

[英]Combine array of objects by attribute

嗨,我正在尝试合并一个对象数组,并需要最终结果是一个对象数组,其中一个具有attr唯一性,而另一个则是一个数组,该数组具有原始第二个attr的所有值

数组我有:

let arr = [
    { 
        name: 'cdd_register', 
        levels: 'read' 
    }, { 
        name: 'cdd_register', 
        levels: 'write' 
    }, { 
        name: 'annual_reports', 
        levels: 'write' 
    }
];

我期望的结果是:

let result = [
    { 
        name: 'cdd_register', 
        levels: ['read', 'write']
    }, { 
        name: 'annual_reports', 
        levels: 'write' 
    }
];

我有后端的回应

data: [{
    id:1
    label: "Administrator"
    name: "admin"
    permissions:{
        data: [{
            id: 4, 
            name: "cdd_register.read", 
            label: "Read access on CDD Register module"
        }, {
            id: 6, 
            name: "cdd_register.write", 
            label: "Write access on CDD Register module"
        }, {
            id: 7, 
            name: "annual_reports.write", 
            label: "Write access on Annual Reports module"
        }]
    }
}]

在此之后

getModules(roles) {
    let modules = [];

    _.forEach(roles, role => {
        _.forEach(role.permissions.data, permission => {
            modules.push(permission);
        })
    });

    return _.uniqBy(modules, 'id').map(module => {
        let moduleArray = module.name.split('.');
            return {
                 name: moduleArray[0],
                 levels: moduleArray[1]
            }
        });
    }
}

我得到了现在的结果,但是无法找出最好的方法(干净)。

谢谢。

这可以通过许多不同的方式来完成。 一种可能的方法是使用一些功能魔术

 let arr = [{ name: 'cdd_register', levels: 'read' }, { name: 'cdd_register', levels: 'write' }, { name: 'annual_reports', levels: 'write' }]; let result = arr.reduce((acc, x) => { const found = acc.find(y => (x.name == y.name)); if (!found) { acc.push({ name: x.name, levels: arr .filter(y => (x.name == y.name)) .map(z => (z.levels)) }); } return acc; }, []) console.log(result) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM