如何使用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);