如何比较两个不同的javascript对象相同的属性(不比较实例函数)
How to compare two different javascript objects for same attributes (without comparing the instance function)
如何比较对象任务内部的树结构与obj_after树,而不必实际比较树中的单个节点。(一个是类的实例,即具有实例方法,另一个没有函数,只有数据)
请阅读以下内容以了解我的确切问题(从上面看不太清楚)。
我正在写一个基于js对象树构建GUI的脚本。我用的是coffeescript
我想创建一个类,接受json,并构建树。
window.GuiTree = class GuiTree
constructor:(json_GUI_tree)->
但是我遇到的问题是在测试这个。我想添加方法到这个类,如'add_node'。这将向GuiTree添加一个新节点。
所以我在Jasmine中尝试了这个。
obj_before =
1:
type:"text"
name:"task"
label:"Task"
2:
type:"subsection"
sections:
3:
4:
type:"text"
name:"subtask"
label:"Subtask"
obj_after =
1:
type:"text"
name:"task"
label:"Task"
2:
type:"subsection"
sections:
3:
4:
type:"text"
name:"subtask"
label:"Subtask"
5:
type:"text"
name:"subtask"
label:"Subtask"
我将任务5添加到Gui树
我想这样测试一下
task = new GuiTree(obj_before)
expect(task.add(3, node_5)).givesNewTree(obj_after)
匹配器'givesNewTree'是一个自定义匹配器。
问题就在这里!!如何比较对象任务内部的树结构与obj_after树,而不必实际比较树中的单个节点。(一个是)
对我来说,这看起来像是写了很多容易出错的代码来比较树。所以我可能需要编写测试来测试。有没有更聪明的方法
您正在寻找的是深度等价的实现。它们不一定容易出错,事实上有几个已知的实现,最著名的是QUnit的deeequal实现。这是另一个。当然这是一个相当复杂的算法。
你当然也可以在你的GuiTree
类中定义一个.equals
(或类似的命名)方法,以一种更简单的方式比较两个实例,基于你已经知道的关于它们的重要信息,但我将首先尝试现有的深度相等算法,因为你可能能够导入以前编写的代码,你已经知道是正确的。
一个不太高明的选择是在两个对象上执行JSON.stringify()
,并期望得到的JSON
编码字符串相等,但我怀疑这会导致循环引用之类的各种问题,但它可能会让您开始。
就在今天,Underscore.js 1.2.0发布了,它包含了一个新的_.isEqual
函数,可以处理循环。Underscore是一个健壮、成熟且相当小的库,可在客户端和服务器端JavaScript中工作。
- 使用javascript比较对象中的对象值和数组长度
- 角度深度比较对象(特定属性除外)
- 比较对象类型时是否需要第三个=
- 如何在 JavaScript 中使用 # 符号比较对象
- 使用isBetween函数比较对象中的键值
- 使用lodash比较对象并从数组中删除对象
- 按值比较对象
- 比较对象数组,最佳方式
- 比较对象中的元素
- 如何通过比较对象属性来查找列表中的对象
- JavaScript松散比较对象和字符串
- 是否有一个实用程序来深度比较对象在谷歌闭包库
- 使用Linq.js比较对象数组的每个成员
- 如何在推入数组之前比较对象
- 当比较对象时,有选择地控制角$watch的发射
- 比较对象并只获取存在于所有对象中的对象
- 为什么ava在比较对象列表和对象文本列表时失败
- 使用Lodash比较对象数组和整数数组
- 比较对象数组中的值与对象响应数组中的值
- AngularJS + Jasmine:比较对象