Arrays ES6格式化来自左连接的数据

Arrays ES6格式化来自左连接的数据,arrays,json,for-loop,ecmascript-6,Arrays,Json,For Loop,Ecmascript 6,据推测,我有一个从左连接查询返回的数据,我想通过Javascript格式化它。ES6实现这一目标的方法是什么 假设我有以下数据: [ { "process_name": "Process 1", "bom_qty": 1.000000, "wip_qty": 20, "material_name": "Material 1", "material_id": "id 1", "process_id": 1 },

据推测,我有一个从左连接查询返回的数据,我想通过Javascript格式化它。ES6实现这一目标的方法是什么

假设我有以下数据:

[
    {
      "process_name": "Process 1",
      "bom_qty": 1.000000,
      "wip_qty": 20,
      "material_name": "Material 1",
      "material_id": "id 1",
      "process_id": 1
    },
    {
      "process_name": "Process 2",
      "bom_qty": 1.000000,
      "wip_qty": 11,
      "material_name": "Material 2",
      "material_id": "id 2",
      "process_id": 2
    },
    {
      "process_name": "Process 2",
      "bom_qty": 0.000003,
      "wip_qty": 11,
      "material_name": "Material 3",
      "material_id": "id 3",
      "process_id": 2
    },
    {
      "process_name": "Process 3",
      "bom_qty": "",
      "wip_qty": 58,
      "material_name": "Material 4",
      "material_id": "id 4",
      "process_id": 3
    },
    {
      "process_name": "Process 4",
      "bom_qty": "",
      "wip_qty": 58,
      "material_name": false,
      "material_id": "",
      "process_id": 4
    }
]
对于每个物料,查询中都有一个行条目

我想把它转换成这样的东西,具有相同过程的行将被制作成一行,但不同的材质被放置在其中的一个对象数组中:

[
    {
      "process_name": "Process 1",
      "wip_qty": 20,
      "material": [
            {
                "name": "Material 1",
                "id": "id 1",
                "qty": 1.000000
            }
        ],
      "process_id": 1
    },
    {
      "process_name": "Process 2",
      "wip_qty": 11,
      "material": [
            {
                "name": "Material 2",
                "id": "id 2",
                "qty": 1.000000
            },
            {
                "name": "Material 3",
                "id": "id 3",
                "qty":  0.000003
            },
        ],
      "process_id": 2
    },
    {
      "process_name": "Process 3",
      "wip_qty": 58,
        "material": [
            {
                "name": "Material 4",
                "id": "id 4",
                "qty": ""
            }
        ],
      "process_id": 3
    },
    {
      "process_name": "Process 4",
      "wip_qty": 58,
      "material": [
            {
                "name": false,
                "id": "",
                "qty": ""
            }
      ],
      "process_id": 4
    }
]
您可以使用重新塑造您的收藏。
大概是这样的:

const数据=[{
“流程名称”:“流程1”,
“物料清单数量”:1.000000,
“在制品数量”:20,
“材料名称”:“材料1”,
“物料id”:“id 1”,
“进程id”:1
},
{
“流程名称”:“流程2”,
“物料清单数量”:1.000000,
“在制品数量”:11,
“材料名称”:“材料2”,
“物料id”:“id 2”,
“进程id”:2
},
{
“流程名称”:“流程2”,
“物料清单数量”:0.000003,
“在制品数量”:11,
“材料名称”:“材料3”,
“物料id”:“id 3”,
“进程id”:2
},
{
“流程名称”:“流程3”,
“物料清单数量”:“,
“在制品数量”:58,
“材料名称”:“材料4”,
“物料id”:“id 4”,
“进程id”:3
},
{
“流程名称”:“流程4”,
“物料清单数量”:“,
“在制品数量”:58,
“材料名称”:假,
“材料id”:“材料id”,
“进程id”:4
}
];
const newData=data.map(obj=>({
进程名称:obj.process\u名称,
在制品数量:对象在制品数量,
材料:{
名称:对象材料名称,
id:obj.material\U id,
数量:对象在制品数量
}
}));

console.log(newData)映射数组需要半途而废。您仍然需要创建一个中间对象,该对象的值是process_id,键是process_id。然后迭代它;如果该键不存在,则将该值推送到结果数组;如果存在,请将材质阵列推送到现有阵列。有人这样想(在Sagiv前面的代码之后添加):

您可以使用
array#reduce
并创建一个以
process_id
为键的对象。对于每个唯一键,创建一个对象并添加所需的属性。然后,使用
Object.values()
提取所有值

var data=[{“过程名称”:“过程1”,“物料数量”:1.000000,“在制品数量”:20,“材料名称”:“材料1”,“材料id”:“id 1”,“过程id”:1},{“过程名称”:“过程2”,“物料数量”:1.000000,“在制品数量”:11,“材料名称”:“材料2”,“材料id”:“id 2”,“过程id”:2},{“过程名称”:“过程2”,“物料数量”:0.000003,“在制品数量”:11,“材料名称”:“材料3”,“材料id”:“id 3”,“工艺id”:2},{“工艺名称”:“工艺3”,“bom数量”:“在制品数量”:58,“材料名称”:“材料4”,“材料id”:“id 4”,“工艺id”:3},{“工艺名称”:“工艺4”,“bom数量”:“在制品数量”:58,“材料名称”:假,“材料id”:“工艺id”: 4 } ],
结果=对象.values(数据.reduce((r,{工艺名称,物料清单数量,在制品数量,物料名称,物料id,工艺id})=>{
r[process_id]=r[process_id]|{process_名称、在制品数量、物料:[],process_id};
r[process\u id].material.push({name:material\u name,id:material\u id,qty:bom\u qty});
返回r;
},{}));
控制台日志(结果)
const tmpObj = {}
newData.forEach(e => {
  if (tmpObj[e.process_id]) {
    tmpObj[e.process_id].material.push(e.material[0])
  } else {
    tmpObj[e.process_id] = e
  }
})
const resultArray = []
for (let key of Object.keys(tmpObj)) {
  resultArray.push(tmpObj[key])
}
console.log(resultArray)