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