如何将对象任务内的树结构与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)
匹配器“giveNewTree”是一个自定义匹配器。
问题出在这里!!如何将对象任务内的树结构与obj_after树进行比较,而不必实际比较树中的各个节点。 (一个是)
对我来说,看起来很多容易出错的代码来比较树。所以我可能需要编写测试来测试。是否有更聪明的方式。
答案 0 :(得分:4)
您正在寻找的是深度对等的实现。它们不一定容易出错,事实上有几个已知的实现,最着名的是QUnit的deepEqual实现。 Here's另一个。这是一个非常复杂的算法。
你当然可以在你的.equals
类中定义一个GuiTree
(或类似命名的)方法,根据你已经知道的对它们有重要意义,以更简单的方式比较两个实例,但是我将首先尝试现有的深度相等算法,因为您可能能够导入您已经知道正确的先前编写的代码。
一个hackish替代方案是对两个对象执行JSON.stringify()
并期望生成的JSON
编码字符串相等,但我怀疑这可能导致循环引用等各种问题,但它可能会让你开始。
答案 1 :(得分:4)
就在今天,Underscore.js 1.2.0推出了一个可以处理循环的新_.isEqual
函数。 Underscore是一个健壮,成熟且相当小的库,可在客户端和服务器端JavaScript中运行。