博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度比较两个javaScript对象
阅读量:6359 次
发布时间:2019-06-23

本文共 4226 字,大约阅读时间需要 14 分钟。

深度比较两个javaScript对象

1、写在前面

近日遇到的一个需求需要比较两个对象,对象的属性类型相同,属性的值相同,就认为是两个对象是相同的,唯恐自己写的方法不够精炼,因此google找到了解决办法,特此记下。方法出处:http://stackoverflow.com/questions/1068834/object-comparison-in-javascript

2、方法一:Object.toJSON()或 JSON.stringify()

此方法简单,适用于当两个对象的属性顺序相同的时候。
var user1 = {name : "nerd", org: "dev"};var user2 = {name : "nerd", org: "dev"};var eq = user1 == user2;alert(eq); // gives false// var eq1 = Object.toJSON(user1) == Object.toJSON(user2);var eq1 = JSON.stringify(user1) === JSON.stringify(user2)alert(eq1); // gives true

3、方法二、深度比较两个对象(推荐)

深度比较两个对象,当对象的属性类型相同且属性的值相同(对象的顺序可以不一样),两个对象就相等。
function deepCompare(x, y) {        var i, l, leftChain, rightChain;        function compare2Objects(x, y) {            var p;            // remember that NaN === NaN returns false            // and isNaN(undefined) returns true            if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {                return true;            }            // Compare primitives and functions.                 // Check if both arguments link to the same object.            // Especially useful on the step where we compare prototypes            if (x === y) {                return true;            }            // Works in case when functions are created in constructor.            // Comparing dates is a common scenario. Another built-ins?            // We can even handle functions passed across iframes            if ((typeof x === 'function' && typeof y === 'function') ||                (x instanceof Date && y instanceof Date) ||                (x instanceof RegExp && y instanceof RegExp) ||                (x instanceof String && y instanceof String) ||                (x instanceof Number && y instanceof Number)) {                return x.toString() === y.toString();            }            // At last checking prototypes as good as we can            if (!(x instanceof Object && y instanceof Object)) {                return false;            }            if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {                return false;            }            if (x.constructor !== y.constructor) {                return false;            }            if (x.prototype !== y.prototype) {                return false;            }            // Check for infinitive linking loops            if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {                return false;            }            // Quick checking of one object being a subset of another.            // todo: cache the structure of arguments[0] for performance            for (p in y) {                if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {                    return false;                } else if (typeof y[p] !== typeof x[p]) {                    return false;                }            }            for (p in x) {                if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {                    return false;                } else if (typeof y[p] !== typeof x[p]) {                    return false;                }                switch (typeof(x[p])) {                    case 'object':                    case 'function':                        leftChain.push(x);                        rightChain.push(y);                        if (!compare2Objects(x[p], y[p])) {                            return false;                        }                        leftChain.pop();                        rightChain.pop();                        break;                    default:                        if (x[p] !== y[p]) {                            return false;                        }                        break;                }            }            return true;        }        if (arguments.length < 1) {            return true; //Die silently? Don't know how to handle such case, please help...            // throw "Need two or more arguments to compare";        }        for (i = 1, l = arguments.length; i < l; i++) {            leftChain = []; //Todo: this can be cached            rightChain = [];            if (!compare2Objects(arguments[0], arguments[i])) {                return false;            }        }        return true;    }

可以把方法compare2Objects修改成自己想要的条件,比如说不限制属性的类型,只要属性的值相等就认为两个object相等。

转载地址:http://qtbma.baihongyu.com/

你可能感兴趣的文章
以自动化测试撬动遗留系统
查看>>
网络安全初创公司存活之道
查看>>
《图解CSS3:核心技术与案例实战》——1.2节浏览器对CSS3的支持状况
查看>>
《Android应用开发》——2.4节应用类
查看>>
继 One Step 后,锤子科技 Big Bang 正式开源
查看>>
《数据科学:R语言实现》——2.5 使用Excel文件
查看>>
《淘宝店铺设计装修一册通》一2.5 抠图工具的简单运用
查看>>
《音乐达人秀:Adobe Audition实战200例》——实例4 收音机音乐节目转录到电脑里...
查看>>
《JavaScript应用程序设计》一一3.1 过时的类继承
查看>>
Amazon 推出 API 网关使用计划
查看>>
互联网流量超出路由器上限 或致全球断网
查看>>
《基于ArcGIS的Python编程秘笈(第2版)》——2.5 限制图层列表
查看>>
GNOME 地图 3.20 加入更多新特性 可用性得到加强
查看>>
《代码整洁之道:程序员的职业素养》导读
查看>>
《计算复杂性:现代方法》——习题
查看>>
Mozilla 释出更新修复中间人攻击漏洞
查看>>
思科表态反对网络中立
查看>>
《HTML5+CSS3网页设计入门必读》——1.5 利用多种Web浏览器执行测试
查看>>
Velocity官方指南-容器
查看>>
国家为何如此重视石墨烯?
查看>>