如何使用JavaScript从数据创建嵌套对象?
以前 这是一个具有多行的对象:如何使用JavaScript从数据创建嵌套对象?,javascript,json,angular-cli,Javascript,Json,Angular Cli,以前 这是一个具有多行的对象: { "functions": [ { "package_id": "2", "module_id": "2", "data_id": "2" }, { "package_id": "1", &qu
{
"functions": [
{
"package_id": "2",
"module_id": "2",
"data_id": "2"
},
{
"package_id": "1",
"module_id": "1",
"data_id": "2"
},
{
"package_id": "2",
"module_id": "3",
"data_id": "3"
}
]
}
期望结果
我希望它返回到一个嵌套对象中,如下所示,没有重复项:
{
"packages": [
{
"package_id": "2",
"modules": [
{
"module_id": "2",
"data": [
{
"data_id": "2"
}
]
},
{
"module_id": "3",
"data": [
{
"data_id": "3"
}
]
}
]
},{
"package_id": "1",
"modules": [
{
"module_id": "1",
"data": [
{
"data_id": "2"
}
]
}
]
}
]
}
我已经尝试过在循环中循环,构建多个数组和对象。这会导致重复对象或将对象重写为单个对象。有没有一种更通用的方法来生成JavaScript?这是一个角度6项目
例1
例2:
导致跳过布尔值的原因
var fList = this.functionList;
var dArr = [];
var dObj = {};
var pArr = [];
var pObj = {};
var mArr = [];
var mObj = {};
var rObj = {};
for (var key in fList) {
pObj['package_id'] = fList[key]['package_id'];
mObj['module_id'] = fList[key]['module_id'];
dObj['data_id'] = fList[key]['data_id'];
var pfound = false;
var mfound = false;
var dfound = false;
for (var i = 0; i < pArr.length; i++) {
if (pArr[i].package_id == pObj['package_id']) {
for (var x = 0; x < mArr.length; x++) {
if (pArr[i]['modules'][x].module_id == mObj['module_id']) {
for (var y = 0; y < dArr.length; y++) {
if (pArr[i]['modules'][x]['datas'][y].data_id == dObj['data_id']) {
dfound = true;
break;
}
}
mfound = true;
break;
}
}
pfound = true;
break;
}
}
if (!dfound) {
dArr.push(dObj);
mObj['datas'] = dArr;
dObj = {};
}
if (!mfound) {
mArr.push(mObj);
pObj['modules'] = mArr;
mObj = {};
}
if (!pfound) {
pArr.push(pObj);
pObj = {};
}
dArr = [];
mArr = [];
}
rObj['packages'] = pArr;
console.log(rObj);
这里有一种更通用的方法,使用Arrayreduce根据包id作为键创建分组对象。您可以使用任何循环来构建相同的对象…例如for或forEach 然后使用Object.values从该分组对象获取最终数组 使用Arrayfind之类的方法可以简化遍历,以查看每个包中是否已经存在模块 const group=data.functions.reducea,c=>{ //如果组对象不存在-创建它或使用现有对象 a[c.package_id]=a[c.package_id]|{package_id:c.package_id,模块:[]} //存储对组模块阵列的引用 const mods=a[c.package_id]。模块 //查看该组模块数组中是否存在模块对象 让module=mods.findmod=>mod.module\u id===c.module\u id 如果!模块{ //或者创建新的模块对象 module={module_id:c.module_id,数据:[]} //并将其推入模块阵列中 mods.pushmodule; } //将新数据对象推送到模块数据数组 module.data.push{data\u id:c.data\u id} 归还 }, {} //创建最终结果对象 const res={packages:Object.valuesgrouped} 控制台。logres .作为控制台包装{最大高度:100%!重要;} 常数数据={ 职能:[{ 包裹编号:2, 模块id:2, 资料编号:2 }, { 包裹编号:1, 模块id:1, 资料编号:2 }, { 包裹编号:2, 模块id:3, 资料编号:3 } ] }
我已经在循环中尝试了循环,而不是在问题中添加了尝试过的代码比什么更通用?您根本没有显示任何代码。希望您展示解决您自己问题的尝试,这里的人会帮助您解决这些问题。Stackoverflow不是免费的代码编写service@charlietfl绝对正确!在这个问题上,我也添加了两个尝试。注意,我假设每个包\u id/模块\u id的数据\u id不重复。在reduce的最后一步之前,检查原始数据中是否有重复数据是一个很容易的条件
var fList = this.functionList;
var dArr = [];
var dObj = {};
var pArr = [];
var pObj = {};
var mArr = [];
var mObj = {};
var rObj = {};
for (var key in fList) {
pObj['package_id'] = fList[key]['package_id'];
mObj['module_id'] = fList[key]['module_id'];
dObj['data_id'] = fList[key]['data_id'];
var pfound = false;
var mfound = false;
var dfound = false;
for (var i = 0; i < pArr.length; i++) {
if (pArr[i].package_id == pObj['package_id']) {
for (var x = 0; x < mArr.length; x++) {
if (pArr[i]['modules'][x].module_id == mObj['module_id']) {
for (var y = 0; y < dArr.length; y++) {
if (pArr[i]['modules'][x]['datas'][y].data_id == dObj['data_id']) {
dfound = true;
break;
}
}
mfound = true;
break;
}
}
pfound = true;
break;
}
}
if (!dfound) {
dArr.push(dObj);
mObj['datas'] = dArr;
dObj = {};
}
if (!mfound) {
mArr.push(mObj);
pObj['modules'] = mArr;
mObj = {};
}
if (!pfound) {
pArr.push(pObj);
pObj = {};
}
dArr = [];
mArr = [];
}
rObj['packages'] = pArr;
console.log(rObj);