如何按对象中的id-key字段分组生成目标对象数组?
按id-key字段分组聚合Payload数据
问题描述
给定一个包含嵌套对象的输入Payload,需要按照id-key字段执行分组操作,将相同id-key对应的productId聚合到数组中,生成指定结构的对象数组。
输入Payload(注:原始输入存在重复键问题,已修正为数组形式)
{ "id": { "header_id": "460", "id-branch": [ { "branch-name": "genaral motors", "req-name": "genaral motors", "id-key": "0791", "id-lines": { "id-key": "0791", "productId": "463" } }, { "branch-name": "genaral motors", "req-name": "genaral motors", "id-key": "9692", "id-lines": [ { "id-key": "9692", "productId": "464" }, { "id-key": "9692", "productId": "465" } ] } ] } }
说明:原始输入中
id对象下存在两个同名的id-branch键,在JSON/JavaScript环境中重复键会被后面的覆盖,因此修正为数组形式以保留所有分支数据;同时第二个分支的id-lines也修正为数组,避免重复键导致数据丢失。
期望输出
[ { "branch-name": "genaral motors", "req-name": "genaral motors", "type": "dhl", "lines-ids": "swr", "lines": [ { "productId": "463" } ] }, { "branch-name": "genaral motors", "req-name": "genaral motors", "type": "dhl", "lines-ids": "swr", "lines": [ { "productId": "464" }, { "productId": "465" } ] } ]
实现方案(JavaScript)
// 修正结构后的输入数据 const input = { "id": { "header_id": "460", "id-branch": [ { "branch-name": "genaral motors", "req-name": "genaral motors", "id-key": "0791", "id-lines": { "id-key": "0791", "productId": "463" } }, { "branch-name": "genaral motors", "req-name": "genaral motors", "id-key": "9692", "id-lines": [ { "id-key": "9692", "productId": "464" }, { "id-key": "9692", "productId": "465" } ] } ] } }; // 执行分组聚合 const result = input.id['id-branch'].map(branch => { // 统一将id-lines转为数组格式 const linesList = Array.isArray(branch['id-lines']) ? branch['id-lines'] : [branch['id-lines']]; // 提取productId构造lines数组 const lines = linesList.map(item => ({ productId: item.productId })); // 构造目标结构对象 return { "branch-name": branch['branch-name'], "req-name": branch['req-name'], "type": "dhl", "lines-ids": "swr", lines }; }); console.log(JSON.stringify(result, null, 2));
代码说明
- 结构修正处理:先将原始输入中存在重复键的
id-branch和id-lines转为数组,确保所有数据不丢失。 - 统一行数据格式:判断
id-lines是否为数组,统一转为数组后再处理,避免单条数据和多条数据的格式差异。 - 聚合productId:遍历行数据,提取
productId并构造指定格式的lines数组。 - 生成目标对象:按照期望输出的结构填充字段,其中
type和lines-ids为固定值。
内容的提问来源于stack exchange,提问作者james11
相关产品推荐
相关产品推荐

