如何比较两个不同的javascript对象的相同属性(不比较实例函数)

时间:2011-10-05 09:30:01

标签: javascript class object tree coffeescript

如何将对象任务内的树结构与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树进行比较,而不必实际比较树中的各个节点。 (一个是)

对我来说,看起来很多容易出错的代码来比较树。所以我可能需要编写测试来测试。是否有更聪明的方式。

2 个答案:

答案 0 :(得分:4)

您正在寻找的是深度对等的实现。它们不一定容易出错,事实上有几个已知的实现,最着名的是QUnit的deepEqual实现。 Here's另一个。这是一个非常复杂的算法。

你当然可以在你的.equals类中定义一个GuiTree(或类似命名的)方法,根据你已经知道的对它们有重要意义,以更简单的方式比较两个实例,但是我将首先尝试现有的深度相等算法,因为您可能能够导入您已经知道正确的先前编写的代码。

一个hackish替代方案是对两个对象执行JSON.stringify()并期望生成的JSON编码字符串相等,但我怀疑这可能导致循环引用等各种问题,但它可能会让你开始。

答案 1 :(得分:4)

就在今天,Underscore.js 1.2.0推出了一个可以处理循环的新_.isEqual函数。 Underscore是一个健壮,成熟且相当小的库,可在客户端和服务器端JavaScript中运行。