Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的树遍历_Javascript_Node.js_Mongodb_Nested Sets - Fatal编程技术网

javascript中的树遍历

javascript中的树遍历,javascript,node.js,mongodb,nested-sets,Javascript,Node.js,Mongodb,Nested Sets,我正在尝试为存储在节点中的MongoDB中的页面生成URL 使用以下函数,我希望遍历一个javascript对象,并显示每个元素的路径。 我就快到了,但我被卡住了——甚至有更好的方法使用异步来实现这一点(我必须承认,这让我有点困惑) 功能:() 预期输出: /michael/ /michael/angela/oscar /michael/meredith/creed /michael/meredith/creed/kelly /michael/ /michael/angela/ /michae

我正在尝试为存储在节点中的MongoDB中的页面生成URL

使用以下函数,我希望遍历一个javascript对象,并显示每个元素的路径。

我就快到了,但我被卡住了——甚至有更好的方法使用异步来实现这一点(我必须承认,这让我有点困惑)

功能:()

预期输出:

/michael/
/michael/angela/oscar
/michael/meredith/creed
/michael/meredith/creed/kelly
/michael/
/michael/angela/
/michael/angela/oscar/
/michael/meredith/
/michael/meredith/creed/
/michael/meredith/kelly/
[
  {
    "name": "michael",
    ...
    "children": [
      {
        "name": "angela",
        ...
        "children": [
          {
            "name": "oscar",
            ...
            "children": []
          }
        ]
      },
      {
        "name": "meredith",
        ...
        "children": [
          {
            "name": "creed",
            ...
            "children": []
          },
          {
            "name": "kelly",
            ...
            "children": []
          }
        ]
      },
      { ... }
    ]
  }
]
对象:

/michael/
/michael/angela/oscar
/michael/meredith/creed
/michael/meredith/creed/kelly
/michael/
/michael/angela/
/michael/angela/oscar/
/michael/meredith/
/michael/meredith/creed/
/michael/meredith/kelly/
[
  {
    "name": "michael",
    ...
    "children": [
      {
        "name": "angela",
        ...
        "children": [
          {
            "name": "oscar",
            ...
            "children": []
          }
        ]
      },
      {
        "name": "meredith",
        ...
        "children": [
          {
            "name": "creed",
            ...
            "children": []
          },
          {
            "name": "kelly",
            ...
            "children": []
          }
        ]
      },
      { ... }
    ]
  }
]
如果有帮助,则使用嵌套集存储数据:
因此,可能有更好的方法使用嵌套集(对上述对象求反)来完成上述工作。

给你。对于循环,您不需要第二个
,因为您的
printree
函数无论如何都要循环所有内容()

函数打印树(人,slug){
slug=slug | |'/';
for(var i=0;i > 你也可以在ECMA5中考虑一些东西,以防你进一步使用<代码>树>代码>,或者想使用除<代码> /<代码>之外的其他分隔符。@bioball-answer没什么错,这只是给了你更多的灵活性

function makeTree(people, slug, sep) {
    slug = slug || '/';
    sep = sep || slug;
    return people.reduce(function (tree, person) {
        var slugPerson = slug + person.name + sep;

        return tree.concat(slugPerson, makeTree(person.children, slugPerson, sep));
    }, []);
}

function printTree(tree) {
    tree.forEach(function (path) {
        console.log(path);
    });
}

printTree(makeTree(data));

上,我不太喜欢重新发明轮子,所以这里有一个使用。我们将它用于许多数据处理任务,并且非常喜欢它,因为它使事情更易于维护。然而,有一个学习曲线。不管怎样,这里是你解决问题的方法

//const objectScan=require('object-scan');
常量扫描树=(树)=>objectScan(['**.children']{
反面:错,
breakFn:({isMatch,parents,context})=>{
如果(!isMatch){
返回
}
上下文推送(
`/${家长
.filter((p)=>p中的“name”)
.map(({name})=>name)
.reverse()
.join(“/”)}/`
);
}
})(树,[]);
const tree=[{id:'52fc69975ba8400021da5c7a',name:'michael',children:[{id:'52fc69975ba8400021da5c7d',parentId:'52fc69975ba8400021da5c7a',name:'angela',children:[{id:'52fc69975ba8400021da5c83',parentId:'52fc69975ba8400021da5c7d',name:'oscar children[]}],{id:'52FC69975BA840002DA5C7B',parentId:'52FC69975BA840002DA5C7A',姓名:'meredith',子女:[{id:'52FC69975BA840002DA5C7F',parentId:'52FC69975BA840002DA5C7B',姓名:'creed',子女:[]},{id:'52FC69975BA840002DA5E',parentId:'52FC69975BA840002DA5B7B',姓名:'kelly',子女:[]},{id:'52fc69975ba8400021da5c7c',parentId:'52fc69975ba8400021da5c7a',name:'jim',children:[{id:'52fc69975ba8400021da5c82',parentId:'52fc69975ba8400021da5c7c',name:'dwight',children:[]},{id:'52fc69975ba8400021da5c80',parentId:'52fc69975ba8400021da5c7c',name:'phyllis children,{id:'52fc69975ba8400021da5c81',parentId:'52fc69975ba8400021da5c7c',name:'stanley',children:[]}]}];
scanTree(tree.map)((e)=>console.log(e));
//=>/迈克尔/
//=>/迈克尔/安吉拉/
//=>/迈克尔/安吉拉/奥斯卡/
//=>/michael/meredith/
//=>/michael/meredith/creed/
//=>/michael/meredith/kelly/
//=>/迈克尔/吉姆/
//=>/迈克尔/吉姆/德怀特/
//=>/迈克尔/吉姆/菲利斯/
//=>/michael/jim/stanley/
。作为控制台包装{最大高度:100%!重要;顶部:0}

嗨,这对迈克尔、安吉拉和奥斯卡都有效,但一旦这棵树到达迈克尔的其他孩子那里,它就断了。梅雷迪斯是安吉拉的兄弟,但输出显示梅雷迪斯是安吉拉的孩子。这是因为这行:
slug=slug+people[i].name+“/”;
为您修复了这个问题谢谢!你们两个!太多了:这是一个很好的解决方案!反转此方法生成指向某人的路径会更容易吗?即:给定“Kelly”还有那棵树,generate/michael/meredith/kelly?我目前正试图逆转提供给我的神奇的@bioball和Jason,但我失败了。听起来像是你应该在这里提出的另一个问题,也许你会因为一个好的问题获得更多的代表。但也许你的意思是像这样?当然,你可以更改fil我已经举了两个例子。