js嵌套对象相等比较的一种方法 (原创)
做前端开发经常会遇到比较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嵌套对象相等比较的一种方法 (原创)的更多相关文章
- js区别对象和数组的三种方法
var arr = {}||[]; 区分arr是数组还是对象 1.arr.constructor ...
- 原生JS—实现图片循环切换的两种方法
今天我们主要讲讲如何使用原生JS实现图片的循环切换的方法.多余的话我们就不多说了,我们一个一个开始讲吧. 1 原生JS实现图片循环切换 -- 方法一 在上栗子之前我们先简单介绍一下所用的一些知识点. ...
- JavaScript进阶(四)js字符串转换成数字的三种方法
js字符串转换成数字的三种方法 在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b. ...
- Jsp页面跳转和js控制页面跳转的几种方法
Jsp 页面跳转的几种方法 1. RequestDispatcher.forward() 在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servle ...
- js 动态加载事件的几种方法总结
本篇文章主要是对js 动态加载事件的几种方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 有些时候需要动态加载javascript事件的一些方法往往我们需要在 JS 中动态添 ...
- js如何动态创建表格(两种方法)
js如何动态创建表格(两种方法) 一.总结 一句话总结: 1.方法一:写好创建表格的html代码,将之赋值给div的innerHTML. 2.方法二.直接用创建好的table元素的方法insertRo ...
- js中常用追加元素的几种方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- js 控制页面跳转的5种方法
js 控制页面跳转的5种方法 编程式导航: 点击跳转路由,称编程式导航,用js编写代码跳转. History是bom中的 History.back是回退一页 Histiory.go(1)前进一页 Hi ...
- JS XMLHttpRequesst对象 http post的五种请求状态
记录一下js中对http请求的几种状态,下附代码 readyState 存有 XMLHttpRequest 的状态.从 0 到 4 发生变化. 0: 请求未初始化 1: 服务器连接已建立 2: 请求已 ...
随机推荐
- HDU 5441 离线处理 + 并查集
题意:给n个节点m条带权值边的无向图.然后q个问题,每次询问点对的数目,点对需要满足的条件是:1)连通:2)其路径的最大权值不能超过询问值. 分析:如果没次询问一次,dfs一次,很可能超时,因此可以用 ...
- HDU 4771
http://acm.hdu.edu.cn/showproblem.php?pid=4771 给一个地图,@是起点,给一些物品坐标,问取完所有物品的最小步数,不能取完输出-1 物品数最多只有四个,状态 ...
- EasyUI 开发笔记(二)
接上篇 :EasyUI 开发笔记(一) (http://www.cnblogs.com/yiayi/p/3485258.html) 这期就简单介绍下, easyui 的 list 展示, 在easy ...
- [转]透过 Linux 内核看无锁编程
非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...
- Exercise 24: More Practice
puts "Let's practice everything." puts 'You\'d need to know \'bout escapes with \\ that do ...
- 《The Evolution of Lua》读书笔记 1
lua的优点: 可移植性 容易嵌入 体积小 高效率 这些优点都来自于lua的设计目标:简洁.从Scheme获得了很多灵感,包括匿名函数,合理的语义域概念 lua前身: 巴西被禁运,引入计算机软件和 ...
- iOS 自定义选项卡-CYLTabBarController
正常的选项卡流程 cocoapods就不说了 创建一个CYLTabBarControllerConfig类 #import <Foundation/Foundation.h> #impor ...
- bzoj2441 小W的问题
bzoj2441 按照纵坐标排序,从小到大插入数列中,每个点i维护一个data[i]表示未插入序列中横坐标小于i的数的个数(用线段树)其实点i就是“W”中第一个极小点,那么f[j]就等于1到j-1中所 ...
- LeetCode-Combinations
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...
- OpenCV MAT基本图像容器
参考博客: OpenCv中cv::Mat和IplImage,CvMat之间的转换 Mat - 基本图像容器 Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算(参照Mat ...