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

如何使用JavaScript在终端浏览目录查找JSON文件并按目录合并为单个JSON文件

如何用Node.js遍历目录并合并每个目录下的JSON文件

嘿,我懂你想要实现的功能——遍历目录查找JSON文件,把每个目录里的所有JSON文件合并成一个单独的JSON文件,而且你是JavaScript入门选手,需要能在终端运行的代码。没问题,咱们用Node.js来搞定,它自带的文件系统(fs)和路径处理(path)模块就足够了,不用额外安装第三方包,对新手很友好。

完整代码示例

把下面的代码保存成merge-json.js文件:

// 导入Node.js内置的文件系统和路径模块
const fs = require('fs').promises;
const path = require('path');

// 定义要处理的根目录(你可以改成自己需要的路径,比如 './my-json-directories')
const ROOT_DIR = './target-directory';

// 核心异步函数:处理单个目录,合并其中的JSON文件
async function mergeDirectoryJson(dirPath) {
  try {
    // 读取当前目录下的所有文件/子目录
    const files = await fs.readdir(dirPath);
    
    // 筛选出所有.json后缀的文件
    const jsonFiles = files.filter(file => path.extname(file) === '.json');
    
    if (jsonFiles.length === 0) {
      console.log(`目录 ${dirPath} 中没有JSON文件,跳过`);
      return;
    }

    // 存储所有解析后的JSON数据
    let mergedData = []; // 如果你的JSON文件都是数组,用这个
    // let mergedData = {}; // 如果你的JSON文件都是对象,用这个,二选一

    // 遍历每个JSON文件,读取并解析
    for (const file of jsonFiles) {
      const filePath = path.join(dirPath, file);
      const fileContent = await fs.readFile(filePath, 'utf8');
      
      try {
        const jsonData = JSON.parse(fileContent);
        
        // 根据你选择的mergedData类型来合并
        if (Array.isArray(mergedData)) {
          // 如果是数组,直接把当前JSON数组的元素加进去(如果当前文件是数组的话)
          // 如果单个JSON文件是对象,就直接push这个对象
          mergedData = mergedData.concat(jsonData);
        } else {
          // 如果是对象,合并属性(后面的文件会覆盖前面同名属性)
          mergedData = {...mergedData, ...jsonData};
        }
      } catch (parseError) {
        console.error(`解析文件 ${filePath} 时出错: ${parseError.message}`);
      }
    }

    // 生成合并后的文件路径(存在当前目录下,名为merged.json)
    const mergedFilePath = path.join(dirPath, 'merged.json');
    // 将合并后的数据转成JSON字符串,格式化缩进2空格,方便阅读
    await fs.writeFile(mergedFilePath, JSON.stringify(mergedData, null, 2));
    
    console.log(`成功合并 ${dirPath} 下的JSON文件到 ${mergedFilePath}`);
  } catch (error) {
    console.error(`处理目录 ${dirPath} 时出错: ${error.message}`);
  }
}

// 遍历根目录下的所有一级目录,逐个处理
async function processRootDirectory() {
  try {
    const entries = await fs.readdir(ROOT_DIR, { withFileTypes: true });
    // 筛选出所有目录(排除文件)
    const directories = entries.filter(entry => entry.isDirectory()).map(entry => entry.name);
    
    for (const dirName of directories) {
      const dirPath = path.join(ROOT_DIR, dirName);
      await mergeDirectoryJson(dirPath);
    }

    // 如果你还想处理根目录本身的JSON文件,取消下面这行注释
    // await mergeDirectoryJson(ROOT_DIR);
  } catch (error) {
    console.error(`处理根目录 ${ROOT_DIR} 时出错: ${error.message}`);
  }
}

// 启动程序
processRootDirectory();

代码说明(适合入门选手)

  • 模块导入:fs.promises是异步版本的文件操作API,用async/await语法写起来更像同步代码,比回调函数容易理解。
  • 根目录配置:修改ROOT_DIR为你想要处理的目录路径,相对路径绝对路径都可以。
  • 合并逻辑选择:代码里提供了两种合并方式:
    • 数组合并:适合每个JSON文件都是数组的情况,会把所有数组合并成一个大数组。
    • 对象合并:适合每个JSON文件都是键值对对象的情况,后面文件的同名属性会覆盖前面的。
  • 错误处理:每个步骤都加了错误捕获,避免一个文件出错导致整个程序崩溃,还会打印错误信息方便排查。

如何运行

  1. 确保你已经安装了Node.js(终端输入node -v能看到版本号就说明安装好了)。
  2. 把上面的代码保存成merge-json.js。
  3. 打开终端,进入代码所在的目录,运行命令:
    node merge-json.js
    

额外提示

  • 如果需要递归处理所有嵌套子目录(比如根目录下的子目录里还有子目录),可以修改processRootDirectory函数,让它递归遍历所有目录,需要的话可以告诉我,我再给你调整代码。
  • 确保所有JSON文件格式都是正确的,否则解析时会报错,程序会跳过出错的文件继续处理其他的。

内容的提问来源于stack exchange,提问作者Tassisto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:48:10