我正在尝试对通用树进行深度优先搜索(DFS)。每个节点的目标是知道其级别及其下的最大级别。示例树如下所示:

javascript - 变量未关闭-LMLPHP

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。我认为它没有正确关闭变量,但我必须承认我不知道如何更改它以使其起作用,我认为它必须是某种形式的闭合,但是我无法适应在闭包上找到的其他Stack答案。

 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");

最佳答案

您正在使用单个数组levelAndPath,并将对它的引用推入levelInfo,而不是推入不同的数组。 (我没有查看是否有其他错误,但是可以通过在var levelAndPath=[];内移动forEach来轻松解决此错误。)

它与闭包无关。这是levelInfo[parent]=levelAndPath;不会复制levelAndPath的事实-它只是粘贴在引用中。这是一个令人眼花demo乱的演示,这要归功于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...

关于javascript - 变量未关闭,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56268172/

10-11 12:58