本js代码通过对js对象进行各方面的比较来判断两个对象是否相等
cmp = function( x, y ) {
// If both x and y are null or undefined and exactly the same
if ( x === y ) {
return true;
}
// If they are not strictly equal, they both need to be Objects
if ( ! ( x instanceof Object ) || ! ( y instanceof Object ) ) {
return false;
}
//They must have the exact same prototype chain,the closest we can do is
//test the constructor.
if ( x.constructor !== y.constructor ) {
return false;
}
for ( var p in x ) {
//Inherited properties were tested using x.constructor === y.constructor
if ( x.hasOwnProperty( p ) ) {
// Allows comparing x[ p ] and y[ p ] when set to undefined
if ( ! y.hasOwnProperty( p ) ) {
return false;
}
// If they have the same strict value or identity then they are equal
if ( x[ p ] === y[ p ] ) {
continue;
}
// Numbers, Strings, Functions, Booleans must be strictly equal
if ( typeof( x[ p ] ) !== "object" ) {
return false;
}
// Objects and Arrays must be tested recursively
if ( ! Object.equals( x[ p ], y[ p ] ) ) {
return false;
}
}
}
for ( p in y ) {
// allows x[ p ] to be set to undefined
if ( y.hasOwnProperty( p ) && ! x.hasOwnProperty( p ) ) {
return false;
}
}
return true;
};
使用:
objA={
a:'123',
b:'456'
};
objB={
a:'123',
b:'000'
};
var isEqual= cmp(objA, objB);
console.log(isEqual); // false 不相同
我们更深入的进行对比
在JavaScript中比较两个对象的成员是否相等有点麻烦,如果只是第一层比较,很容易,但子对象里的属性可能又是一个对象,所以只能递归。
代码:
// 去重
Array.prototype.unique = function(){
this.sort();
var re=[this[0]];
for(var i = 1; i < this.length; i++){
if( this[i] !== re[re.length-1]){
re.push(this[i]);
}
}
return re;
}
var o2o = function(o1,o2){
if(typeof o1 != typeof o2){
return false;
}
if(typeof o1.length != typeof o2.length ){
return false;
}
var bool = true;
var keyArr1 = [];
var keyArr2 = [];
for(var i in o1){
keyArr1.push(i);
}
for(var i in o2){
keyArr2.push(i);
}
if(keyArr1.length != keyArr2.length){
return false;
}
for(var i=0, k=keyArr2.length;i<k;i++){
keyArr1.push(keyArr2[i]);
}
var keyArr = keyArr1.unique();
for(var i=0,k=keyArr.length;i<k;i++){
if( ( keyArr[i] in o1 ) && ( keyArr[i] in o2 ) ){
if( typeof o1[keyArr[i]] == 'object' && typeof o2[keyArr[i]] == 'object' ){
bool = o2o( o1[keyArr[i]], o2[keyArr[i]] );
}else if( o1[keyArr[i]] !== o2[keyArr[i]] ){
return false;
}
}else{
return false;
}
}
return bool;
};
使用:
var o1 = {
age : 18,
info : {
'author' : 'lee',
'job' : [
'a','b'
]
},
'name' : 'laowu'
};
var o2 = {
'name' : 'laowu',
'age' : 18,
info : {
'author' : 'lee',
'job' : [
'a',
'b'
]
}
};
console.log(o2o(o1,o2)); // true
把o1的age换成字符串的18
var o1 = {
age : "18",
info : {
'author' : 'lee',
'job' : [
'a','b'
]
},
'name' : 'laowu'
};
var o2 = {
'name' : 'laowu',
'age' : 18,
info : {
'author' : 'lee',
'job' : [
'a',
'b'
]
}
};
console.log(o2o(o1,o2)); // false
类型不一致,结果为false