JavaScript判断对象是否相等
实现一、
var obj = {a:'a'},obj1 = {b:'b'},obj2 = {a:'a'};
就是使用
JSON.stringify()
先把对象转化成字符串,
这样就可以啦
console.log(JSON.stringify(obj) == JSON.stringify(obj1));//false
console.log(JSON.stringify(obj) == JSON.stringify(obj2));//true
弊端:这样不是很严谨,如果一个对象里是有两个属性的,只是位置不一样而已,这样的方法就是错误的
var a ={"name":"lsx","age":12};
var b ={"age":12,"name":"lsx"};
console.log(JSON.stringify(a) == JSON.stringify(b))
------false
实现二、
思路
只要两个对象的名和键值都相同。那么两个对象的内容就相同了
1.用Object.getOwnPropertyNames拿到对象的所有键名数组
2.比对键名数组的长度是否相等。否=>false。真=>3
3.比对键名对应的键值是否相等
function isObjectValueEqual(a, b) { var aProps = Object.getOwnPropertyNames(a); var bProps = Object.getOwnPropertyNames(b); if (aProps.length != bProps.length) { return false; } for (var i = 0; i < aProps.length; i++) { var propName = aProps[i]; var propA = a[propName]; var propB = b[propName]; if ( propA !== propB) { return false; } } return true;
弊端:粗略一看没问题,但是细心的同学发现如果 键值也是对象的话,那这个方法就不管用了,比如下面的测试数据
var a = { id:1, name:2, c:{ age:3 } }; var b = { id:1, name:2, c:{ age:3 } } console.log(isObjectValueEqual(a,b));//false
实现三、
在实现二的基础上递归实现
isObjectValueEqual(a, b) { var aProps = Object.getOwnPropertyNames(a); var bProps = Object.getOwnPropertyNames(b); if (aProps.length != bProps.length) { return false; } for (var i = 0; i < aProps.length; i++) { var propName = aProps[i] var propA = a[propName] var propB = b[propName] if ((typeof (propA) === 'object')) { if (this.isObjectValueEqual(propA, propB)) { return true } else { return false } } else if (propA !== propB) { return false } else { } } return true },
再次测试:
var a = { id:1, name:2, c:{ age:3 } }; var b = { id:1, name:2, c:{ age:3 } } console.log(isObjectValueEqual(a,b));//true
【注】、上面三种方式实现三是最靠谱的