java 比较两个json,JS中如何比较两个Json对象是否相等实例代码

本文介绍了一种在JavaScript中比较两个JSON对象是否完全相同的实用方法。通过实现递归遍历及对比对象属性值来确保所有层级的数据都一致。适用于前端开发中的数据校验场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在js前端面试过程中,经常会遇到这样的笔试题:JS中如何比较两个Json对象是否相等实例代码,下面小编抽点时间给大家整理下,一起看看吧。

1.先准备三个工具方法,用于判断是否是对象类型,是否是数组,获取对象长度

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;

}

2.准备两个相同或不同的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": "马栏山二号"

}

3.主要的代码

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;

}

4.调用方法

var result = Compare(jsonObjA, jsonObjB);

console.log(result); // true or false

### 实现对象相等性的比较 在编程中,不同语言提供了多种方式来实现对象之间的相等比较。以下是几种常见的方式: #### Python 中的对象相等比较 Python 默认使用 `__eq__` 和 `__ne__` 方法来进行对象间的相等性和不相等性判断。当创建一个新的类时,默认情况下这两个方法会基于对象的身份(即内存地址)进行比较。 为了使两个实例被认为是相同的,可以通过重写这些特殊方法来自定义逻辑[^1]: ```python class MyClass: def __init__(self, value): self.value = value def __eq__(self, other): if isinstance(other, MyClass): return self.value == other.value return False def __ne__(self, other): return not (self == other) ``` #### Java 中的对象相等比较 Java 提供了一个名为 `equals()` 的方法用于检测两个对象是否相等。此方法最初是在 Object 类中定义的,并且默认行为是比较引用身份——也就是说,只有当两个变量指向同一个实际对象时才会返回 true。然而,许多标准库类已经覆盖了这一方法以便更合理地反映语义上的平等关系[^4]。 要在一个自定义类里实现有意义的对象间对比,应该覆写 `equals()` 函数并提供具体的匹配条件。同时建议也一并覆写 `hashCode()` 来保持一致性: ```java public class MyCustomClass { private String name; @Override public boolean equals(Object obj) { if (this == obj) return true; // 如果是同一对象则直接返回true if (!(obj instanceof MyCustomClass)) return false; MyCustomClass that = (MyCustomClass) obj; return Objects.equals(name, that.name); } @Override public int hashCode() { return Objects.hash(name); } } ``` #### C++ 中的操作符重载 C++允许通过操作符重载机制改变特定运算符的行为模式。对于想要控制自己定义的数据结构之间如何被判定为“等于”或“不等于”的开发者来说,这是一项非常有用的功能。通常做法是对 `operator==` 进行重载以指定何时认为两个实体应当视为相同;而对于 `operator!=` 可以利用前者的结果取反得到结果,因此不必单独处理[^2]: ```cpp #include <iostream> using namespace std; struct Point { double x, y; bool operator==(const Point& rhs)const{ return this->x == rhs.x && this->y == rhs.y ; } bool operator!=(const Point &rhs)const{ return !(*this == rhs); } }; int main(){ Point p1{0.5 , 0.7},p2 {0.5,0.8}; cout << ((p1 != p2)? "Not Equal":"Equal")<< endl; } ``` #### 序列化字符串比较法 除了上述传统意义上的属性逐项对照外,还有一种较为间接但也颇为实用的技术叫做序列化后的JSON字符串比较。尽管这不是最高效的解决方案,但在某些场景下确实能够简化开发工作量特别是面对复杂的嵌套结构体时[^5]。 例如,在 JavaScript 或者支持 JSON 处理 API 的其他现代脚本语言里面,可以轻松完成如下转换与验证过程: ```javascript function areObjectsEqual(objA,objB){ const strA=JSON.stringify(objA),strB=JSON.stringify(objB); return strA===strB; } console.log(areObjectsEqual({name:"Alice"},{name:"Bob"})); // 输出:false console.log(areObjectsEqual({age:29},{age:29})); // 输出:true ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值