做前端开发经常会遇到比较js对象是否相等的情况, 或者说其它问题往往会归结到这个问题上来:比如对象数组的去重复。

网上看到过很多例子, 但是基本上都是那种比较简单的对象结构, 而复杂的对象结构,比如对象嵌套对象的情况,还没找到什么直接可以用的代码。

所以今天,就花了点时间写了一个函数实现这个功能, 也是方便自己日后使用, 当然也可以供大家参考。

注释: 目前这个方法只适用于对象的属性是基本类型和对象类型, 数组类型暂时还没考虑, 后面有时间写一个全的。----所以说下面的方法相当于比较两个树

第一个方法: 主要是将对象当做一个树, 通过递归遍历,将对象的所有属性当做节点保存在二维数组中。(这个方法也适用于任何树形数据结构的遍历)

         /*          * 递归方式将obj的所有树路径规整到二维数组中,第一维度表示路径个数,第二个维度表示每条路径上的节点
* 返回的是这个二维数组
*/
function getObjKeyPath(pathArry, paths, obj){
for(var key in obj){
var type = obj[key].constructor.name; //获取属性值对应的类型
if(type == "Object"){
if(!paths){
paths = [];
}
paths.push(key);
getObjKeyPath(pathArry, paths, obj[key]);
}else{
if(!paths){
pathArry.push([key]);
}else{
var arry = paths.concat();//目的是复制数组
arry.push(key);
pathArry.push(arry);
}
}
}
return pathArry;
}

第二个方法就是实际的比较函数:

输入参数就是两个对象, 返回true表示两个对象完全相等,反之不等.

主要想法就是,用上面的函数获取到两个对象的属性树, 然后以“叶子节点多的对象作为大树”, 依次取大树的叶子节点路径在小数上的对应值, 一旦取不到或者取到不相等则两个对象肯定不相等。

        function CompareObj(obj1, obj2){
var keys1 = getObjKeyPath([], null, obj1);
var keys2 = getObjKeyPath([], null, obj2);
var bigObj = null;
var smallObj = null;
var keys = null;
if(keys1.length >= keys2.length){
bigObj = obj1;
smallObj = obj2;
keys = keys1;
}else{
bigObj = obj2;
smallObj = obj1;
keys = keys2;
}
for(var i in keys){
var val1 = bigObj;
var val2 = smallObj;
for(var j in keys[i]){
var key = keys[i][j];
val1 = val1[key];
val2 = val2[key];
if(val2 == undefined){
return false;
}
}
if(val1 != val2){
return false;
}
}
return true;
}

调用就很简单了:

var flag = CompareObj(obj1, obj2);

js嵌套对象相等比较的一种方法 (原创)的更多相关文章

  1. js区别对象和数组的三种方法

    var arr = {}||[];            区分arr是数组还是对象            1.arr.constructor                              ...

  2. 原生JS—实现图片循环切换的两种方法

    今天我们主要讲讲如何使用原生JS实现图片的循环切换的方法.多余的话我们就不多说了,我们一个一个开始讲吧. 1  原生JS实现图片循环切换 -- 方法一 在上栗子之前我们先简单介绍一下所用的一些知识点. ...

  3. JavaScript进阶(四)js字符串转换成数字的三种方法

    js字符串转换成数字的三种方法 在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b. ...

  4. Jsp页面跳转和js控制页面跳转的几种方法

    Jsp 页面跳转的几种方法 1. RequestDispatcher.forward() 在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servle ...

  5. js 动态加载事件的几种方法总结

    本篇文章主要是对js 动态加载事件的几种方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助   有些时候需要动态加载javascript事件的一些方法往往我们需要在 JS 中动态添 ...

  6. js如何动态创建表格(两种方法)

    js如何动态创建表格(两种方法) 一.总结 一句话总结: 1.方法一:写好创建表格的html代码,将之赋值给div的innerHTML. 2.方法二.直接用创建好的table元素的方法insertRo ...

  7. js中常用追加元素的几种方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. js 控制页面跳转的5种方法

    js 控制页面跳转的5种方法 编程式导航: 点击跳转路由,称编程式导航,用js编写代码跳转. History是bom中的 History.back是回退一页 Histiory.go(1)前进一页 Hi ...

  9. JS XMLHttpRequesst对象 http post的五种请求状态

    记录一下js中对http请求的几种状态,下附代码 readyState 存有 XMLHttpRequest 的状态.从 0 到 4 发生变化. 0: 请求未初始化 1: 服务器连接已建立 2: 请求已 ...

随机推荐

  1. html默认属性

    对于display为block来说width默认是满长的,即父级得100%,而高度是0,除非手动设置为100%或指定高度.

  2. [GodLove]Wine93 Tarining Round #9

    比赛链接: http://vjudge.net/contest/view.action?cid=48069#overview 题目来源: lrj训练指南---二维几何计算   ID Title Pro ...

  3. 蓝牙-HCI错误码列表

    错误码定义: /* Success code */ #define HCI_SUCCESS 0x00 /* Possible error codes */ #define HCI_UNKNOWN_HC ...

  4. 数据分析:中国高校更名历史 Python

    上周领了新任务,做国内高校改名历史的统计,这个挺有意思,以下是我任务完成过程,和大家分享. 一. 数据收集 数据需求:目前已有高校校名,各高校改名历史记录 高校校名数据来源:尝试从高校排名网站(iPI ...

  5. Android硬盘缓存技术DiskLruCache技术笔记

    防止多图OOM的核心解决思路就是使用LruCache技术,但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次,这显然非常耗时.因此Googl ...

  6. input 栏位光标末尾闪烁

    var input1 =window.document.getElementById("input1").createTextRange(); input1.collapse(fa ...

  7. websphere性能调优之dump命令

    websphere性能调优之dump命令 基于WebSphere 构建的企业应用,时常会出现性能问题,在严重的情况下还会提示出内存溢出,这是一件很让人恼怒的事情.在WebSphere Applicat ...

  8. 【WEB前端】使用百度ECharts,绘制项目质量报表

    一.下载ECharts的js库 下载地址:http://echarts.baidu.com/download.html 由于我们对体积无要求,所以我们采用了完整版本,功能齐全,在项目中,我们只需要像普 ...

  9. JS 获取地址栏三级域名(改进版)

    <script type="text/javascript"> str="http://yl.www.tyg.com/index.php"; str ...

  10. C#参数化执行SQL语句,防止漏洞攻击本文以MySql为例【20151108非查询操作】

    为什么要参数化执行SQL语句呢? 一个作用就是可以防止用户注入漏洞. 简单举个列子吧. 比如账号密码登入,如果不用参数, 写的简单点吧,就写从数据库查找到id和pw与用户输入一样的数据吧 sql:se ...