You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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();

使用说明

  1. 确保你的data.json是待合并对象组成的数组,比如:
[
  { "fred": { "john": "batman", "james": "hero" } },
  { "john": "tailor", "fred": { "james": "robin" } }
]
  1. 把代码保存为merge-json.js,和data.json放在同一个目录下
  2. 运行node merge-json.js,就能在同目录下得到符合要求的output.json

额外小细节

  • 代码里加了hasOwnProperty检查,避免遍历到原型链上的属性,更安全
  • 特意排除了null的情况,因为typeof null会返回object,防止错误合并
  • 用了异步的fs.promises,避免阻塞主线程,处理大文件也更顺畅

内容的提问来源于stack exchange,提问作者M.J. Nicholls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:24:11