JavaScript深度比较两个对象是否相等

JavaScript 2013-07-25 JavaScript,对象,比较

在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

文字链接:《JavaScript深度比较两个对象是否相等

文章地址:http://www.qttc.net/201307358.html

除非标注,琼台博客所有博文均为原创,转载请加文字链接注明来源

乳名?小名?昵称?网名?均可

email,放心,我不会给你乱投广告的

想获得回访就把你的站点URL写上(没有留空)

[NOTICE]木要投放广告
[NOTICE]木要骂人,说不该说的话
[NOTICE]自由言论,但要遵纪守法

Comments 0

    Hi,你想第一个做沙发么?