如何优雅合并嵌套JSON对象?特定JSON数组合并需求问询
优雅实现JSON值的扁平化与重新映射
嘿,这个需求完全可以用JavaScript的数组和对象API组合出简洁优雅的实现,不用手动写循环去逐个添加值或者计数~
核心思路
我们需要两步完成:
- 把原数组中每个对象的所有值提取出来,合并成一个一维数组
- 将这个一维数组转成以索引为键的对象,最后包在数组里
简洁实现方案(现代JS环境)
const originalData = [ { "2": "a", "3": "a" }, { "2": "f", "3": "a", "4": "p" }, { "2": "n", "3": "o", "4": "t" } ]; const result = [ Object.fromEntries( originalData .flatMap(obj => Object.values(obj)) .entries() ) ]; console.log(result); // 输出: [ { "0":"a", "1":"a", "2":"f", "3":"a", "4":"p", "5":"n", "6":"o", "7":"t" } ]
代码解释:
originalData.flatMap(obj => Object.values(obj)):遍历原数组的每个对象,用Object.values()取出对象的所有值,flatMap会自动把这些分散的数组合并成一个一维数组,结果是["a", "a", "f", "a", "p", "n", "o", "t"].entries():对一维数组调用entries(),会得到迭代器,每一项是[索引, 值]的结构(比如[0, "a"]、[1, "a"])Object.fromEntries(...):直接把[键, 值]格式的迭代器转换成对象,自动将索引转为字符串类型的键- 最后把生成的对象包裹在数组里,就是你要的预期输出
兼容旧环境的替代方案
如果你的运行环境不支持flatMap或Object.fromEntries(比如旧版浏览器),可以用以下写法:
const originalData = [ { "2": "a", "3": "a" }, { "2": "f", "3": "a", "4": "p" }, { "2": "n", "3": "o", "4": "t" } ]; // 第一步:扁平化所有值 const flattenedValues = [].concat(...originalData.map(obj => Object.values(obj))); // 第二步:转成索引为键的对象 const resultObj = flattenedValues.reduce((acc, val, index) => { acc[index] = val; return acc; }, {}); // 最后包在数组里 const result = [resultObj];
这种写法用concat+map替代flatMap,用reduce替代Object.fromEntries,兼容性更好,逻辑也清晰易懂~
内容的提问来源于stack exchange,提问作者user6038900
相关产品推荐
相关产品推荐

