如何用lodash重组对象数组?
我的数据库收到以下响应:
[
{
"id": 1,
"select": true,
"insert": true,
"update": true,
"delete": false,
"template": {
"id": 1,
"name": "Template 1"
},
"module": {
"id": 1,
"name": "Module 1"
}
}
{
"id": 2,
"select": false,
"insert": true,
"update": true,
"delete": false,
"template": {
"id": 1,
"name": "Template 1"
},
"module": {
"id": 2,
"name": "Module 2"
}
}
{
"id": 3,
"select": true,
"insert": true,
"update": false,
"delete": false,
"template": {
"id": 2,
"name": "Template 2"
},
"module": {
"id": 1,
"name": "Module 1"
}
}
]
因此,我的root
对象具有两个嵌套对象(template
,module
)及其各自的属性。
我想以template
应该是root
对象,应该具有modules
属性和模块对象数组的方式转换我的数组。 Module
对象应具有permissions
属性,且其中包含select, insert, update, delete
道具。如您所见,template
对象已重复。我想避免结果数组中template
对象重复,应该将它们合并。
所以结果应如下所示:
[
{
"id":1,
"name":"Template 1",
"modules":[
{
"id":1,
"name":"Module 1",
"permissions":{
"select":true,
"insert":true,
"update":true,
"delete":false
}
},
{
"id":2,
"name":"Module 2",
"permissions":{
"select":false,
"insert":true,
"update":true,
"delete":false
}
}
]
},
{
"id":2,
"name":"Template 2",
"modules":[
{
"id":1,
"name":"Module 1",
"permissions":{
"select":true,
"insert":true,
"update":false,
"delete":false
}
}
]
}
]
如何使用lodash实现这一目标?
回答如下:这不是lodash,但我相信应该在没有外部依赖的情况下完成类似的简单操作。
const data = [
{
"id": 1,
"select": true,
"insert": true,
"update": true,
"delete": false,
"template": {
"id": 1,
"name": "Template 1"
},
"module": {
"id": 1,
"name": "Module 1"
},
},
{
"id": 2,
"select": false,
"insert": true,
"update": true,
"delete": false,
"template": {
"id": 1,
"name": "Template 1"
},
"module": {
"id": 2,
"name": "Module 2"
},
},
{
"id": 3,
"select": true,
"insert": true,
"update": false,
"delete": false,
"template": {
"id": 2,
"name": "Template 2"
},
"module": {
"id": 1,
"name": "Module 1"
},
},
];
const reorgData = data => {
return Object.values(
data.reduce((newObj, { id, module, template, ...permissions }) => {
if (!newObj[template.name]) {
newObj[template.name] = template;
newObj[template.name].modules = [];
}
newObj[template.name].modules.push({
...module,
permissions,
});
return newObj;
}, {})
);
};
console.log(reorgData(data));