實現一、
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
【注】、上面三種方式實現三是最靠譜的