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

How to compare two different javascript objects for same attributes (without comparing the instance function)

本文关键字:比较 对象 属性 实例 javascript 函数 两个 何比较      更新时间:2023-09-26

如何比较对象任务内部的树结构与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中工作。