Упаковка дерева в массив в Javascript - PullRequest
2 голосов
/ 16 февраля 2010

Хорошо, так что это не должно быть трудным, однако я столкнулся со странными и странными случайностями.

Я пытаюсь упаковать дерево в массив, где каждый узел выглядит примерно так:

  • title: строка для отображения
  • ключ: id-значение
  • children: массив дочерних узлов

случайность такая странная, что я вообще не могу этого понять: когда я пытаюсь добавить ребенка в узел, я делаю что-то вроде

if(node.children == undefined) {
  node.children = new Array();
}

node.children.push({ title: value, key: key });

это удаляло некоторые ранее вставленные узлы .... поэтому я провел некоторую отладку и обнаружил, что этот код:

if(node.children == undefined) {
  node.children = new Array();
}

был виноват, что не имеет никакого смысла - node.children = new Array () не должен удалять НИЧЕГО, если node.children не определен ......, верно?

Я что-то не так делаю? если так, как мне упаковать дерево в массив в Javascript?

Ответы [ 3 ]

4 голосов
/ 16 февраля 2010

То, как вы используете значение undefined, не соответствует стандартным практикам Javascript. Я не уверен, решит ли это вашу проблему, но попробуйте изменить код на

if (typeof(node.children) == 'undefined') { 
  node.children = [];
}

Это может действительно помочь. Также, как вы можете видеть, использование конструктора Array не нужно: [] создает новый пустой массив.

Undefined не является зарезервированным словом в Javascript. Ничто не мешает вам установить

undefined = 2;

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

1 голос
/ 16 февраля 2010

Чтобы проверить, существует ли свойство объекта, используйте hasOwnProperty

if (!node.hasOwnProperty('children')) {
    node.children = [];
}
1 голос
/ 16 февраля 2010

Вы пробовали оператор in?

if (!("children" in node))
  node.children = [];
...