JavaScript比较两个对象是否相等几个例子

本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

时间: 2024-08-28 17:49:10

JavaScript比较两个对象是否相等几个例子的相关文章

JavaScript比较两个对象是否相等的方法_javascript技巧

本文实例讲述了JavaScript比较两个对象是否相等的方法.分享给大家供大家参考.具体如下: 在Python中可以通过cmp()内建函数来比较两个对象所包涵的数据是否相等(数组.序列.字典).但是在javascript语言中并没有相关的实现.本js代码通过对js对象进行各方面的比较来判断两个对象是否相等 cmp = function( x, y ) { // If both x and y are null or undefined and exactly the same if ( x ==

freemarker中比较一个list中的两个对象的属性是否相等

问题描述 freemarker中比较一个list中的两个对象的属性是否相等 freemarker我从后台map里放了个list,然后想遍历list的时候对list中两个索引中对象的值做比较怎么弄,代码如下我想比较索引两个下标中对象的carbrandname是否相等,根据结果动态生成页面 <#list carList as obj> ${obj_index}.${obj.carbrandname == obj.carbrandname} <#if (${obj_index.obj.carb

面向对象-javascript中这两种对象属性有什么区别?

问题描述 javascript中这两种对象属性有什么区别? 第一种:function aaa(){} aaa.a=111; 第二种:function bbb(){} bbb.prototype.b=111; 我在csdn问过第一种,大部分人说属于面向对象的范畴. 但是我看了几篇js面向对象博客,都是用第二种原型的方式: 所以想知道这两种给对象添加属性的行为,在实际应用中有什么区别? 解决方案 如果把aaa,bbb作为方法来看,这两者没有区别. 如果把aaa,bbb作为类来看,那有区别. aaa.

javascript面向对象之访问对象属性的两种方式分析_javascript技巧

本文实例分析了javascript面向对象之访问对象属性的两种方式.分享给大家供大家参考.具体如下: javascript面向对象的访问对象属性的两种方式.如下代码所示: 复制代码 代码如下: <script language="javascript" type="text/javascript"> function Person(){}; var p1 = new Person(); p1.name="王美人"; document.

详解JavaScript权威指南之对象_javascript技巧

JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自有的属性外,还可以从一个称为原型的对象继承属性.对象的方法通常是继承的属性.这种"原型式集成"是JavaScript的的核心特征. 1.创建对象 第一种:对象直接量表示法创建对象. 这是最简单的对象创建方式,对象直接量由若干key:value键值对属性组成,属性之间用逗号分隔,整个对象用花

Javascript学习1 - Javascript中的类型对象

原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象.         常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个方法:toLocalString()                     number.toFixed(digits) 把numberl转换为小数,digits代表小数几位.         常用的与Number对应的全局函数:isNaN(vars) 判断vars是不是数字,  

在JSP页面获取后台action封装的参数,这个参数里面又含有两个对象,二层引用,报错

问题描述 在JSP页面获取后台action封装的参数,这个参数里面又含有两个对象,二层引用,报错 javax.el.PropertyNotFoundException: Property 'userAccount' not found on type java.lang.String 上面是报错信息, 下面是JSP页面: 用户名: ${commentlist.userAccount.userName } 职业: ${commentlist.userAccount.job } ${commentl

详解JavaScript正则表达式之RegExp对象_javascript技巧

一.RegExp对象概述        RegExp对象表示正则表达式,RegExp是正则表达式的缩写,它是对字符串执行模式匹配的强大工具.RegExp对象用于规定在文本中检索的内容.当您检索某个文本时,可以使用一种模式来描述要检索的内容.RegExp就是这种模式.简单的模式可以是一个单独的字符:更复杂的模式包括了更多的字符,并可用于解析.格式检查.替换等. 正则表达式可以规定字符串中的检索位置,以及要检索的字符类型等.二.创建RexExp对象 创建正则表达式和创建字符串类似,创建正则表达式有两

JavaScript中的Array 对象(数组对象)_javascript技巧

 1.创建Array对象方法: --->var arr = [1,2,3];//简单的定义方法 此时可以知道 arr[0] == 1; arr[1] == 2; arr[2] == 3; --->new Array(); var arr = new Array();//定义一个没有任何内容的数组对象,然后以下面的方式为其赋值 arr[0] = "arr0"; arr[1] = "arr1"; arr[2] = "arr2"; ---&