javascript中json数据对比本质是深比较对象内容,需先parse再递归比对,避免引用比较;推荐lodash.isequal,自实现需处理类型判断、循环引用、特殊值及预标准化。

JavaScript 中 JSON 数据的对比,本质是对比两个 JavaScript 对象(或数组)是否“相等”。由于 JSON 本身只是字符串格式,实际对比前需先 JSON.parse() 成对象,再进行结构化比对。直接用 === 或 == 无效,因为对象比较的是引用而非内容。
深比较(Deep Equality)是核心方法
对复杂嵌套对象、数组、混合类型(如含 Date、RegExp、undefined、NaN、循环引用等)的 JSON 数据,必须递归遍历每个键值对。基础逻辑是:类型相同 → 键数量一致 → 每个键存在且值深度相等。
- 简单场景可用
JSON.stringify(a) === JSON.stringify(b),但有严重局限:属性顺序敏感、忽略 undefined、函数和 symbol 不序列化、Date 变成字符串、NaN 变成 null - 推荐使用成熟库如
lodash.isEqual,它已处理 NaN、-0、对象/数组/Map/Set/Date/RegExp 等边界情况 - 若需轻量自实现,可写递归函数,重点判断:
Object.prototype.toString.call(val)区分类型;对数组用Array.isArray()单独处理;对 null 单独判等;对普通对象遍历Object.keys()并递归比对
处理特殊值与边缘情况
真实 JSON 解析后可能出现非标准值(如后端返回的 Date 字符串未转 Date 对象),或前端手动构造含不可序列化字段的对象。这些会直接影响对比结果。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
undefined 和 null:JSON 标准不支持 undefined,
JSON.parse()会丢弃 key: undefined 的字段,但保留"key": null。对比前建议统一过滤或转换 - Date / RegExp / BigInt:JSON 无法原生表示,通常以字符串形式传输(如 ISO 时间)。对比时需约定是否转为 Date 实例再比毫秒数,还是直接比字符串
-
循环引用:
JSON.stringify()会报错,自实现深比较需用 WeakMap 记录已访问对象,避免无限递归
对比前预处理提升可靠性
为减少误判,可在深比较前做标准化处理,让语义相同但格式不同的数据“归一”。
- 排序对象 key(尤其当后端返回顺序不固定时),例如用
Object.keys(obj).sort().reduce(...)构建新对象 - 统一数值精度(如浮点数保留 6 位小数),避免
0.1 + 0.2 !== 0.3导致的误差 - 将时间字符串转为统一格式(如
new Date(str).getTime()),再对比时间戳 - 忽略特定字段(如
id、updatedAt),用 lodash 的omit预处理后再比
调试与可视化差异
仅知道“不相等”不够,生产中常需定位具体哪一层、哪个字段不同。可借助工具输出差异路径。
- 用
deep-diff库,输入两个对象,返回增删改的详细操作列表(如{kind: "E", path: ["user","name"], lhs: "Tom", rhs: "Tim"}) - 简单场景可封装一个带路径追踪的递归函数,在不等时记录当前路径(如
["data", "list", 0, "price"])并终止或继续收集 - 浏览器调试时,用
console.table([a, b])并列查看扁平结构;或用 VS Code 的 JSON 差异插件对比原始字符串
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










