如何用JavaScript将JSON中不同节点下的元素合并到同一节点?
实现思路与代码
首先要明确:你提供的原始JSON存在重复键问题——JavaScript对象(以及JSON规范)不允许同一层级有重复的键,直接用JSON.parse解析时,后面的SO会覆盖前面的,这也是你之前尝试失败的核心原因。所以得先处理原始JSON字符串,修复重复键,再进行数据扁平化。
步骤1:修复重复的SO键
通过正则把重复的SO键合并成一个数组,确保所有SO的内容都能被保留:
// 原始JSON字符串 const rawJson = `{ "PO": [ { "SO": [ { "B": "XXX", "R": "YYY", "F": "ZZZ" }, { "B": "MMM", "R": "NNN", "F": "PPP" } ], "SO": [ { "B": "111", "R": "222", "F": "333" }, { "B": "333", "R": "444", "F": "555" }, { "B": "666", "R": "777", "F": "888" } ] } ] }`; // 修复重复SO键:把多个SO合并成一个SO数组 const fixedJson = rawJson .replace(/"SO":\s*\[/g, (match, idx, str) => idx === str.indexOf('"SO":') ? match : ', ' + match.slice(1) ) .replace(/({)\s*"SO":/g, '$1 "SO": [');
步骤2:解析并扁平化数据
解析修复后的JSON,然后把所有SO下的B/R/F对象提取出来,替换原PO的内容:
// 解析为JavaScript对象 const parsedObj = JSON.parse(fixedJson); // 扁平化数据:提取所有SO中的B/R/F对象 const flattenedData = { PO: parsedObj.PO.flatMap(poItem => poItem.SO.flat()) }; // 输出格式化后的结果 console.log(JSON.stringify(flattenedData, null, 4));
运行结果
执行后会得到你需要的格式:
{ "PO": [ { "B": "XXX", "R": "YYY", "F": "ZZZ" }, { "B": "MMM", "R": "NNN", "F": "PPP" }, { "B": "111", "R": "222", "F": "333" }, { "B": "333", "R": "444", "F": "555" }, { "B": "666", "R": "777", "F": "888" } ] }
内容的提问来源于stack exchange,提问作者272727
相关产品推荐
相关产品推荐

