Javascript рекурсия - Переменные не закрываются - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь выполнить поиск в глубину (DFS) общего дерева. Цель каждого узла - узнать его уровень и максимальное количество уровней под ним. Пример дерева выглядит так:

enter image description here

Порядок DFS должен (я думаю) быть: 1,2,3,5,6,7,4,8,9,10,11.

То, чего я пытаюсь достичь, это: Узел 1: Уровень 1, максимальные уровни ниже = 4

Узел 2: Уровень 2, максимальные уровни ниже = 3

Узел 3: Уровень 3, максимальные уровни ниже = 2

...

Узел 9: Уровень 2, максимальные уровни ниже = 1

Пока что я могу правильно подсчитать уровни и максимальные уровни, но всякий раз, когда я пытаюсь сохранить их в новом объекте, в конечном итоге получается комбинация чисел последнего уровня / максимального уровня (в этом примере это будет уровень = 3, максимальный уровень ниже 0. Я думаю, что он не закрывает переменные должным образом, но я должен признать, что не могу понять, как изменить его, чтобы он работал. Я предполагаю, что это должно быть какое-то вроде замыкания, но я не смог адаптировать ответы других стеков, которые я нашел на замыканиях.

 var groupIDInfo={
 BASE:[1], 1:[2,8,9], 2:[3,4], 3:[5], 4:[], 5:[6,7], 6:[], 7:[], 8:[],
  9:[10,11], 10:[], 11:[]}
var levelInfo={};
var level=0;
var longestPath=0;
var levelAndPath=[];

function detLevels(groupIDInfo, parent){

  if(!(parent in groupIDInfo)){
    console.log("parent not in array");
    return;
  }
  groupIDInfo[parent].forEach(function (child){
    level++;
    if (level>longestPath){
      longestPath=level;      
    }
    levelAndPath[0]=level;
    levelAndPath[1]=longestPath;
    levelInfo[child]=levelAndPath;

    detLevels(groupIDInfo, child);

    level--;
    //set parent longest path
    longestPath=level;
    levelInfo[parent]=levelAndPath;

  });
}
detLevels(groupIDInfo, "BASE");

1 Ответ

1 голос
/ 23 мая 2019

Вы используете один массив levelAndPath и помещаете ссылки на него в levelInfo, а не в разные массивы.(Я не смотрел, есть ли какие-либо другие ошибки помимо этого, но эту легко исправить, переместив var levelAndPath=[]; внутрь forEach.)

Это не о замыканиях.Это факт, что levelInfo[parent]=levelAndPath; не копирует levelAndPath - он просто вставляет ссылку.Вот изумительная демонстрация, благодаря достижениям в фрагментах Stack Overflow:

let a = [1, 2, 3];
let b = [a, a, a];
a[2] = 4;
console.log(JSON.stringify(b)); // Huh? [[1,2,4],[1,2,4],[1,2,4]]?!?
console.log(b);                 // Here's what _really_ happened...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...