通过嵌套的对象集合进行递归始终在第一个叶节点处终止

时间:2015-02-16 04:10:57

标签: javascript recursion

我有一组类似目录的对象,每个对象都有一个属性为同一类对象的数组。这个结构以单个根开头,实现对长度没有理论约束。

以下是对象集合:

var filesystemObjects = [
    {
        path: '/',
        children: 
        [
            {
                path: '/users',
                children: 
                [           
                    {
                        path: '/users/firstuser',
                        children: 
                        [                   
                            {
                                path: '/users/firstuser/documents',
                                children: 
                                [

                                ]
                            },
                        ]
                    },              
                    {
                        path: '/users/seconduser',
                        children: 
                        [
                            {
                                path: '/users/seconduser/documents',
                                children: 
                                [

                                ]
                            }
                        ]
                    },
                ]
            },
            {
                path: '/programFiles',
                children: 
                [

                ]
            },      
            {
                path: '/kurfleOS',
                children: 
                [
                    {
                        path: '/kurfleOS/passwd',
                        children:
                        [

                        ]
                    },
                ]
            },
        ]
    },
];

对于访问每个节点(并且通过扩展,返回与路径查询字符串匹配的对象),这似乎应该是相当微不足道的,尽管不是特别有效。由于分号或括号,代码无法编译。

这是我正在使用的测试方法:

function directoryRecurse(dir) {
    console.log(dir);
    for (ii = 0; ii < dir.children.length; ii++) {
        directoryRecurse(dir.children[ii]);
    }
}

但每次,该方法只搜索(并打印)直到它到达第一个叶节点(在这种情况下为/users/firstuser/documents),输出完全停止。根本没有错误,并且该方法在此之前按预期工作。我真的不确定为什么,特别是因为相同的算法,表面修改,与包含数组的数组的数组完全一样。对于允许这个方法实际遍历整个根,我到底错过了什么?

2 个答案:

答案 0 :(得分:1)

问题是你在递归函数中使用了一个全局变量:

function directoryRecurse(dir) {
    console.log(dir);
    for (ii = 0; ii < dir.children.length; ii++) {
//       ^^
        directoryRecurse(dir.children[ii]);
    }
}

您需要将变量声明为local,以便每个递归步骤不会相互干扰:

for (var ii = 0; ii < dir.children.length; ii++) {
//   ^^^

答案 1 :(得分:-2)

path: '/users/seconduser',
                    children: 
                    [
                        {,// try this and for ascending lines as well
//Why did you not put a comma here wouldn't this end
//your execution. You have commas on all other lines you say execute