JSTree - почему в javascript остановлена ​​рекурсия? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь удалить поддерево (хотя бы один узел) из дерева, поэтому я строю рекурсивную функцию:

function remove(i)
{
      tree = $('#jstree-tree').jstree(true).get_json('#', {flat:true});
      j=0;
      console.log(tree);
      while(j<tree.length)
      {
          if(tree[i].id == tree[j].parent)
          {
              remove(j);
              j--;
          }
          j++;
      }

      tree.splice(i,1);
}

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

1 Ответ

0 голосов
/ 01 мая 2018

Теперь j является глобальной переменной из-за объявления без var. Выше значение j влияет на другие исполнения remove().

Изменение j=0; на var j=0; устраняет эту проблему, но она вызывает бесконечный цикл. Кажется, что рекурсия remove() блокирует отражение значения tree до $('#jstree-tree'). Чтобы избежать этой проблемы, выполните tree = ...get_json(...) на внешней стороне рекурсии и используйте ее повторно.

Это рабочий код:

function remove(arg)
{
    tree = $('#jstree-tree').jstree(true).get_json('#', {flat:true});
    var _remove = function (i) {
        var j = 0;
        while(j < tree.length)
        {
            if(tree[i].id == tree[j].parent)
            {
                  _remove(j);
                  j--;
            }
            j++;
        }
        tree.splice(i,1);
    }
    _remove(arg);
}
...