如何在Node.js中实现JSON数组条目合并与层级覆盖式数据合并并输出至新文件?
实现Node.js中JSON的栈式层级覆盖合并
嘿,这个需求我之前做过类似的,刚好能给你一个靠谱的实现方案,完全贴合你说的栈式层级覆盖逻辑——也就是后面的(更高层级)条目覆盖前面的同名字段,但嵌套对象里没被覆盖的字段会保留下来。
先理清楚核心逻辑
你举的例子很直观:
将对象
{ fred: { john: 'batman', james: 'hero' } }与{ john: 'tailor', fred: { james: 'robin' } }进行叠加合并后,结果为{ john: 'tailor', fred: { john: 'batman', james: 'robin' } }
本质上这是深度优先的递归合并:
- 如果两个对象有同名的非对象字段,直接用后面的(高层级)值覆盖前面的
- 如果是嵌套对象,就递归进去合并,而不是直接替换整个嵌套对象
完整代码实现
下面是直接能用的Node.js代码,包含读取data.json、合并条目、写入output.json的完整流程:
const fs = require('fs').promises; const path = require('path'); // 核心合并函数:实现栈式层级覆盖的递归合并 function mergeObjects(target, source) { // 遍历源对象的所有键 for (const key in source) { // 跳过原型链上的属性,避免意外问题 if (!source.hasOwnProperty(key)) continue; // 判断当前键对应的值是否都是有效对象(排除null) const isTargetObj = typeof target[key] === 'object' && target[key] !== null; const isSourceObj = typeof source[key] === 'object' && source[key] !== null; if (isTargetObj && isSourceObj) { // 嵌套对象递归合并 mergeObjects(target[key], source[key]); } else { // 非对象字段直接用高层级值覆盖 target[key] = source[key]; } } return target; } // 主处理函数:读取文件、合并、写入结果 async function processJsonMerge() { try { // 读取data.json,假设里面是待合并的对象数组 const rawContent = await fs.readFile(path.join(__dirname, 'data.json'), 'utf8'); const entries = JSON.parse(rawContent); // 初始化合并结果,从第一个条目开始 let mergedResult = entries[0] || {}; // 依次合并后面的所有条目(后面的是高层级,优先覆盖) for (let i = 1; i < entries.length; i++) { mergedResult = mergeObjects(mergedResult, entries[i]); } // 将合并结果写入output.json,格式化输出方便阅读 await fs.writeFile( path.join(__dirname, 'output.json'), JSON.stringify(mergedResult, null, 2), 'utf8' ); console.log('合并完成!结果已经写入output.json'); } catch (err) { console.error('处理过程中出错了:', err.message); } } // 执行合并操作 processJsonMerge();
使用说明
- 确保你的
data.json是待合并对象组成的数组,比如:
[ { "fred": { "john": "batman", "james": "hero" } }, { "john": "tailor", "fred": { "james": "robin" } } ]
- 把代码保存为
merge-json.js,和data.json放在同一个目录下 - 运行
node merge-json.js,就能在同目录下得到符合要求的output.json
额外小细节
- 代码里加了
hasOwnProperty检查,避免遍历到原型链上的属性,更安全 - 特意排除了
null的情况,因为typeof null会返回object,防止错误合并 - 用了异步的
fs.promises,避免阻塞主线程,处理大文件也更顺畅
内容的提问来源于stack exchange,提问作者M.J. Nicholls
相关产品推荐
相关产品推荐

