Макет дерева d3.js - перекрестные ссылки

Я создал интерактивное принудительно-направленное дерево связанных объектов с помощью d3. Узлы и связи создаются с использованием древовидной структуры d3.

Структура данных следующая:

{
  "name": "node name",
  "id": 1,
  "children": [
    {
      "name": "child node name",
      "id": 2
    },
    {
      "name": "child node name",
      "id": 3
    },
    ...
  ]
},
...

Узлы / ссылки создаются следующим образом:

var nodes = flatten(rootNode);
var links = d3.layout.tree().links(nodes);

Чтобы включить двунаправленный обход дерева, я рекурсивно прохожу по дереву от каждого вновь созданного узла и добавляю родительские ссылки ко всем узлам.

Дерево можно расширить, щелкнув листовой узел. Затем данные загружаются через AJAX, и дерево обновляется.

Проблема заключается в том, что объекты с одним и тем же идентификатором / именем могут встречаться в дереве несколько раз. Есть ли способ чисто объединить все повторяющиеся узлы (которые преобразовали бы дерево в граф из-за перекрестных ссылок) из кода JavaScript?

Изменить. ..


person Danilo Bargen    schedule 25.09.2012    source источник
comment
у вас есть jsfiddle для лучшей визуализации?   -  person manu    schedule 25.09.2012
comment
@manu: Трудно воспроизвести из-за динамических вызовов AJAX ... Мне не нужен реальный код в качестве ответа, это скорее концептуальный вопрос :)   -  person Danilo Bargen    schedule 25.09.2012
comment
просто для понимания: есть ли у каждого узла свой уникальный идентификатор? после этого каждый узел можно разместить под несколькими родителями?   -  person manu    schedule 26.09.2012
comment
@manu у каждого узла должен быть уникальный идентификатор. проблема в том, что два узла с одинаковым идентификатором (что означает, что это один и тот же объект базы данных) могут быть в дереве после загрузки дополнительных данных, поэтому их следует объединить, включая все ссылки.   -  person Danilo Bargen    schedule 26.09.2012


Ответы (1)


Понятно ... как насчет того, чтобы вести дополнительный список со всеми доступными узлами дерева? таким образом вам не придется повторно проходить иерархию.

person manu    schedule 28.09.2012
comment
Проблема не в обходе (я могу получить плоский список всех узлов с помощью функции flatten()), а в том, как обнаруживать дубликаты и связывать их вместе, при этом (если возможно) сохраняя базовую структуру дерева. Я предположил, что это может быть чистый способ d3. - person Danilo Bargen; 28.09.2012