项目多文件JSON数值比对

在开发项目中难免遇到之前前辈开发的代码,其中可能会存在一些JSON文件,比如国际化语言文件、对类型数据文件,但这些文件就有可能存在数据之间缺失、长时间没有更新,多文件中的数据就有数据之间存在差异的文件,要是你来一个个维护,一个个key的对比数据但凡多点这就是巨大的工作量,而且还容易在对比过程中产生遗漏,这样又要重新开始比对。所以就有了通过node.js,写个脚本来比对的必须。

下面两个场景就是对应你对文件对比差异的不同要求。

比对文件,区分差异

比对两个文件中数值的差异,并输入相对差异值

js 复制代码
// merge-objects.mjs
import { writeFileSync } from 'fs';
import { resolve, dirname } from 'path';
import { fileURLToPath, pathToFileURL } from 'url';

// 获取当前文件路径
const __dirname = dirname(fileURLToPath(import.meta.url));

// 解析命令行参数
const [, , file1Path, file2Path, outputPath] = process.argv;

if (!file1Path || !file2Path || !outputPath) {
    console.error('用法: node merge-objects.mjs <文件1> <文件2> <输出文件>');
    process.exit(1);
}

// 异步加载模块
async function loadModule(filePath) {
    try {
        const absolutePath = resolve(__dirname, filePath);
        const moduleUrl = pathToFileURL(absolutePath).href;
        const module = await import(moduleUrl);
        return module.default || module;
    } catch (error) {
        console.error(`无法加载文件 ${filePath}:`, error);
        process.exit(1);
    }
}

// 合并对象
function mergeObjects(obj1, obj2) {
    return {
        ...obj1.config,
        ...obj2.config,
    };
}

// 生成输出内容
function generateOutput(obj) {
    return `// 自动生成的合并对象
export default ${JSON.stringify(
        obj,
        (key, value) => {
            // 处理特殊类型(可选)
            return typeof value === 'function' ? value.toString() : value;
        },
        2,
    )};`;
}

// 主程序
async function main() {
    const obj1 = await loadModule(file1Path);
    const obj2 = await loadModule(file2Path);
    console.log('obj1', obj1);
    console.log('obj2', obj2);
    const merged = mergeObjects(obj1, obj2);

    try {
        const outputContent = generateOutput(merged);
        writeFileSync(resolve(__dirname, outputPath), outputContent);
        console.log(`✅ 合并完成,结果已保存至 ${outputPath}`);
    } catch (error) {
        console.error('写入文件失败:', error);
        process.exit(1);
    }
}

main();

比对文件,合并差异

比对两个文件中数值的差异,已后者为准覆盖前者,合并数值并输入

js 复制代码
import {  writeFileSync } from 'fs';
import { resolve, dirname } from 'path';
import { fileURLToPath, pathToFileURL } from 'url';

// 获取当前文件路径
const __dirname = dirname(fileURLToPath(import.meta.url));
// 读取并解析输入文件
async function readObject(filePath) {
    try {
        const absolutePath = resolve(__dirname, filePath);
        const moduleUrl = pathToFileURL(absolutePath).href;
        const module = await import(moduleUrl);
        return module.default || module;
    } catch (error) {
        console.error(`无法加载文件 ${filePath}:`, error);
        process.exit(1);
    }
}

// 比较两个对象的键,返回差异对象
function getDifference(obj1, obj2) {
    const diff = {};
    const diff2 = {}
    // 获取所有唯一键
    const allKeys = new Set([...Object.keys(obj1), ...Object.keys(obj2)]);    
    allKeys.forEach(key => {
        if (!obj1.hasOwnProperty(key) && obj2.hasOwnProperty(key)) {
            diff2[key] = obj2[key];
        } else if (obj1.hasOwnProperty(key) && !obj2.hasOwnProperty(key)) {
            diff[key] = obj1[key];
        }
    });
    
    return {
        diff,
        diff2
    };
}
// 生成输出内容
function generateOutput(obj) {
    return `// 自动生成的合并对象
export default ${JSON.stringify(
        obj,
        (key, value) => {
            // 处理特殊类型(可选)
            return typeof value === 'function' ? value.toString() : value;
        },
        2,
    )};`;
}
// 主程序
async function main() {
    try {
        const [file1, file2, outputFile] = process.argv.slice(2);
        
        if (!file1 || !file2 || !outputFile) {
            throw new Error('参数不足。用法: node script.js <文件1> <文件2> <输出文件>');
        }

        const obj1 = await readObject(file1);
        const obj2 = await readObject(file2);
        const difference = getDifference(obj1, obj2);
        const outputContent = generateOutput(difference);
        // 写入结果文件
        writeFileSync(resolve(__dirname, outputFile), outputContent);
        console.log(`差异已保存至: ${outputFile}`);
    } catch (error) {
        console.error('错误:', error.message);
        process.exit(1);
    }
}

main();

以上的代码文件通过node运行,注意包含代码的文件以.mjs类型命名,在你创建文件的路径下,这样才能运行文件 运行文件命令

shell 复制代码
node [你的文件名].mjs [第一个文件].js [第二个文件].js
相关推荐
敲敲了个代码1 天前
从硬编码到 Schema 推断:前端表单开发的工程化转型
前端·javascript·vue.js·学习·面试·职场和发展·前端框架
dly_blog1 天前
Vue 响应式陷阱与解决方案(第19节)
前端·javascript·vue.js
消失的旧时光-19431 天前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
console.log('npc')1 天前
Table,vue3在父组件调用子组件columns列的方法展示弹窗文件预览效果
前端·javascript·vue.js
我命由我123451 天前
SVG - SVG 引入(SVG 概述、SVG 基本使用、SVG 使用 CSS、SVG 使用 JavaScript、SVG 实例实操)
开发语言·前端·javascript·css·学习·ecmascript·学习方法
C_心欲无痕1 天前
vue3 - markRaw标记为非响应式对象
前端·javascript·vue.js
qingyun9891 天前
深度优先遍历:JavaScript递归查找树形数据结构中的节点标签
前端·javascript·数据结构
胡楚昊1 天前
NSSCTF动调题包通关
开发语言·javascript·算法
熬夜敲代码的小N1 天前
Vue (Official)重磅更新!Vue Language Tools 3.2功能一览!
前端·javascript·vue.js
小彭努力中1 天前
1.在 Vue 3 中使用 Cesium 快速展示三维地球
前端·javascript·vue.js·#地图开发·#cesium·#vue3