JavaScript深度比较两个JSON对象是否相等的实现方法
本文介绍在JavaScript中如何判断两个JSON对象是否完全相等。通过封装判断对象类型、数组及获取长度的工具函数,结合递归算法处理嵌套结构和数组元素,实现深度比较逻辑。代码包含完整的Compare函数及测试用例,适用于前端面试及实际开发中的对象一致性校验场景。
在前端JavaScript面试中,经常会出现一道经典笔试题:如何判断两个JSON对象是否相等?本文将通过具体实例代码,详细梳理实现这一功能的思路与步骤,供读者参考学习。
基础工具函数封装
首先,我们需要构建三个基础辅助函数,分别用于检测变量是否为对象类型、是否为数组,以及计算对象的属性数量。
function isObj(object) {
return object && typeof (object) == 'object' && Object.prototype.toString.call(object).toLowerCase() == "[object object]";
}
function isArray(object) {
return object && typeof (object) == 'object' && object.constructor == Array;
}
function getLength(object) {
var count = 0;
for (var i in object) count++;
return count;
}
接下来,定义两个JSON对象作为测试数据,这两个对象在结构上相同,但在部分数值或字符串值上可能存在差异,用于验证比较逻辑的准确性。
测试数据定义
var jsonObjA = {
"Name": "MyName",
"Company": "MyCompany",
"Infos": [
{ "Age": "100" },
{
"Box": [
{ "Height": "100" },
{ "Weight": "200" }
]
}
],
"Address": "马栏山"
}
var jsonObjB = {
"Name": "MyName",
"Company": "MyCompany",
"Infos": [
{ "Age": "100" },
{
"Box": [
{ "Height": "100" },
{ "Weight": "200" }
]
}
],
"Address": "马栏山二号"
}
核心比较逻辑由Compare函数及其内部递归函数CompareObj组成。Compare函数首先校验输入是否为有效对象,并对比属性数量是否一致。随后调用CompareObj进行深度遍历,通过递归处理嵌套对象和数组,逐层比对键值对是否完全匹配。
核心比较算法实现
function Compare(objA, objB) {
if (!isObj(objA) || !isObj(objB)) return false; //判断类型是否正确
if (getLength(objA) != getLength(objB)) return false; //判断长度是否一致
return CompareObj(objA, objB, true);//默认为true
}
function CompareObj(objA, objB, flag) {
for (var key in objA) {
if (!flag) //跳出整个循环
break;
if (!objB.hasOwnProperty(key)) { flag = false; break; }
if (!isArray(objA[key])) { //子级不是数组时,比较属性值
if (objB[key] != objA[key]) { flag = false; break; }
} else {
if (!isArray(objB[key])) { flag = false; break; }
var oA = objA[key], oB = objB[key];
if (oA.length != oB.length) { flag = false; break; }
for (var k in oA) {
if (!flag) //这里跳出循环是为了不让递归继续
break;
flag = CompareObj(oA[k], oB[k], flag);
}
}
}
return flag;
}
最后,调用Compare函数传入测试对象,并通过console.log输出比较结果(true或false),以验证代码执行的正确性。
调用与结果验证
var result = Compare(jsonObjA, jsonObjB);
console.log(result); // true or false
JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
