Как сравнить два разных объекта javascript для одинаковых атрибутов (без сравнения с функцией экземпляра) - PullRequest
0 голосов
/ 05 октября 2011

Как мне сравнить древовидную структуру внутри задачи объекта с деревом obj_after без необходимости фактически сравнивать отдельные узлы в дереве.(один является экземпляром класса, то есть с методами экземпляра, а другой не имеет функций, только данные).

Пожалуйста, прочитайте ниже, чтобы понять мою точную проблему (не так ясно из вышеупомянутого).

Я пишу скрипт, который создает графический интерфейс на основе дерева объектов js.Для этого я использую coffeescript.

Я хотел бы создать класс, который принимает json, и построить дерево.

window.GuiTree = class GuiTree
    constructor:(json_GUI_tree)->

Но проблема в том, что я испытываю это.Я хотел бы добавить методы к этому классу как 'add_node'.Это добавляет новый узел в GuiTree.

Итак, я попробую это в Жасмин.

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 ]

4 голосов
/ 06 октября 2011

Только сегодня вышла Underscore.js 1.2.0 с новой функцией _.isEqual, которая может обрабатывать циклы.Underscore - это надежная, зрелая и достаточно небольшая библиотека, которая работает как на клиентском, так и на серверном JavaScript.

4 голосов
/ 05 октября 2011

То, что вы ищете, это реализация глубокой эквивалентности. Они не обязательно подвержены ошибкам, на самом деле существует несколько известных реализаций, наиболее известной является реализация deepEqual в QUnit. Вот другое. Конечно, это довольно сложный алгоритм.

Конечно, вы можете также определить метод .equals (или с аналогичным именем) в вашем классе GuiTree, который сравнивает два экземпляра более простым способом, основываясь на том, что вы уже знаете о них, но я бы попробовал существовать глубоко Сначала используйте одинаковые алгоритмы, поскольку вы можете импортировать ранее написанный код, который, как вы уже знаете, является правильным.

Хакерская альтернатива - сделать JSON.stringify() для обоих объектов и ожидать, что результирующие закодированные строки JSON будут равны, но я подозреваю, что это может привести к различным проблемам с циклическими ссылками и т.п., но это может помочь вам начать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...