Javascript 在树中递归以创建面包屑列表

Javascript 在树中递归以创建面包屑列表,javascript,recursion,Javascript,Recursion,我有一个数据树,正在尝试创建一个递归函数,将树中的每个路径添加为字符串数组,以便更好地理解递归。我不确定为什么我的方法不能产生预期结果 var树={ “姓名”:“家”, “儿童”:[ { “名称”:“汽车”, “儿童”:[ { “名称”:“福特”, “儿童”:[ { “名称”:“野马” }, { “名称”:“资源管理器” } ] } ] }, { “名称”:“食品”, “儿童”:[ { “名称”:“比萨饼” } ] } ] }; var列表=[]; var路径=[]; 函数遍历(节点){ 如果

我有一个数据树,正在尝试创建一个递归函数,将树中的每个路径添加为字符串数组,以便更好地理解递归。我不确定为什么我的方法不能产生预期结果

var树={
“姓名”:“家”,
“儿童”:[
{
“名称”:“汽车”,
“儿童”:[
{
“名称”:“福特”,
“儿童”:[
{
“名称”:“野马”
},
{
“名称”:“资源管理器”
}
]
}
]
},
{
“名称”:“食品”,
“儿童”:[
{
“名称”:“比萨饼”
}
]
}
]
};
var列表=[];
var路径=[];
函数遍历(节点){
如果(node.name){
path.push(node.name)
}
如果(!node.children){
if(路径长度){
list.push(路径);
}
回来
}否则{
node.children.forEach(函数(项){
导线测量(项目);
});  
}
}
横移(树);

控制台日志(列表)
在所有迭代中修改相同的
路径
数组。您应该复制它:

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, []);

在所有迭代中修改相同的
路径
数组。您应该复制它:

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, []);

我已更正了您的代码,此解决方案将
路径
变量从一个函数调用复制到另一个函数调用:

var树={
“姓名”:“家”,
“儿童”:[{
“名称”:“汽车”,
“儿童”:[{
“名称”:“福特”,
“儿童”:[{
“名称”:“野马”
}, {
“名称”:“资源管理器”
}]
}]
}, {
“名称”:“食品”,
“儿童”:[{
“名称”:“比萨饼”
}]
}]
};
var路径=[];
var列表=[];
函数遍历(节点、路径){
如果(!路径)
路径=[];
if(node.name){
path.push(node.name)
}
list.push(路径);
if(节点子节点){
node.children.forEach(函数(项){
遍历(item,path.slice());
});
}
document.write(JSON.stringify(path)+'
') }
遍历(树,[])我已更正了您的代码,此解决方案将
路径
变量从一个函数调用复制到另一个函数调用:

var树={
“姓名”:“家”,
“儿童”:[{
“名称”:“汽车”,
“儿童”:[{
“名称”:“福特”,
“儿童”:[{
“名称”:“野马”
}, {
“名称”:“资源管理器”
}]
}]
}, {
“名称”:“食品”,
“儿童”:[{
“名称”:“比萨饼”
}]
}]
};
var路径=[];
var列表=[];
函数遍历(节点、路径){
如果(!路径)
路径=[];
if(node.name){
path.push(node.name)
}
list.push(路径);
if(节点子节点){
node.children.forEach(函数(项){
遍历(item,path.slice());
});
}
document.write(JSON.stringify(path)+'
') }
遍历(树,[])首先,您将路径变量存储在递归函数外部,并且从不重置其值。首先,您将路径变量存储在递归函数外部,并且从不重置其值。谢谢!我没有意识到我正在修改相同的数组。应该
list.push(path)不在上述条件下?是的,此帖子有一个挂起的编辑应该可以解决此问题。该编辑与
列表无关。推送(路径)
,并且不是必需的,因为我将
[]
作为第二个参数传递<代码>列表。根据某些对象没有
名称
属性时所需的行为,可能确实需要移动推送(路径)
。谢谢!我没有意识到我正在修改相同的数组。应该
list.push(path)不在上述条件下?是的,此帖子有一个挂起的编辑应该可以解决此问题。该编辑与
列表无关。推送(路径)
,并且不是必需的,因为我将
[]
作为第二个参数传递<当某些对象没有
名称
属性时,根据所需的行为,可能确实需要移动code>list.push(path)