2015-11-05 145 views
0

我有一个数据树,我试图创建一个递归函数来将每个路径添加到树中作为一个字符串数组,以便更好地理解递归。我不知道为什么我的方法不产生预期通过树递归创建面包屑列表

var tree = { 
 
\t "name": "home", 
 
\t "children": [ 
 
\t \t { 
 
\t \t \t "name": "cars", 
 
\t \t \t "children": [ 
 
\t \t \t \t { 
 
\t \t \t \t \t "name": "ford", 
 
\t \t \t \t \t "children": [ 
 
\t \t \t \t \t \t { 
 
\t \t \t \t \t \t \t "name": "mustang" 
 
\t \t \t \t \t \t }, 
 
\t \t \t \t \t \t { 
 
\t \t \t \t \t \t \t "name": "explorer" 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t ] 
 
\t \t \t \t } 
 
\t \t \t ] 
 
\t \t }, 
 
\t \t { 
 
\t \t \t "name": "food", 
 
\t \t \t "children": [ 
 
\t \t \t \t { 
 
\t \t \t \t \t "name": "pizza" 
 
\t \t \t \t } 
 
\t \t \t ] 
 
\t \t } 
 
\t ] 
 
}; 
 

 
var list = []; 
 
var path = []; 
 

 
function traverse(node) { 
 
    if (node.name) { 
 
     path.push(node.name) 
 
    } 
 
    
 
    if (!node.children) { 
 
     if (path.length) { 
 
      list.push(path); 
 
     } 
 
     return; 
 
    } else { 
 
    node.children.forEach(function(item) { 
 
     traverse(item); 
 
    }); 
 
    } 
 
} 
 

 
traverse(tree); 
 
console.log(list);

我期待创建的输出是:

[ 
    ["home"], 
    ["home", "cars"], 
    ["home", "cars", "ford"], 
    ["home", "cars", "ford", "mustang"], 
    ["home", "cars", "ford", "explorer"], 
    ["home", "food"], 
    ["home", "food", "pizza"] 
] 
+0

好一件事你正在存储递归函数外的路径变量,并且永远不会重置其值。 – thatidiotguy

回答

3

您修改同path阵列中的所有迭代。该解决方案复制

var list = []; 
function traverse(node, path) { 
    if (!path) 
    path = []; 
    if (node.name) { 
    path.push(node.name) 
    } 
    list.push(path); 
    if (node.children) { 
    node.children.forEach(function(item) { 
     traverse(item, path.slice()); 
    }); 
    } 
} 
traverse(tree, []); 
+0

谢谢!我没有意识到我正在修改相同的阵列。 – Mdd

+0

应该'list.push(路径);'不在上面的情况? –

+0

是的,这个帖子有一个待解决的编辑问题,应该解决这个问题 – Jaco

1

我已经纠正你的代码中,从一个函数调用path变量其他:而应该把它复制

var tree = { 
 
    "name": "home", 
 
    "children": [{ 
 
    "name": "cars", 
 
    "children": [{ 
 
     "name": "ford", 
 
     "children": [{ 
 
     "name": "mustang" 
 
     }, { 
 
     "name": "explorer" 
 
     }] 
 
    }] 
 
    }, { 
 
    "name": "food", 
 
    "children": [{ 
 
     "name": "pizza" 
 
    }] 
 
    }] 
 
}; 
 

 
var path = []; 
 

 
var list = []; 
 
function traverse(node, path) { 
 
    if (!path) 
 
    path = []; 
 
    if (node.name) { 
 
    path.push(node.name) 
 
    } 
 
    list.push(path); 
 
    if (node.children) { 
 
    node.children.forEach(function(item) { 
 
     traverse(item, path.slice()); 
 
    }); 
 
    } 
 
    document.write(JSON.stringify(path)+ '<br>') 
 
} 
 
traverse(tree, []);