使用JavaScript/Lodash迭代嵌套对象数组

3

我有一个对象数组,代表了一个嵌套的导航列表。

[
    {
        name: 'one',
        link: 'blah/blah',
        pages: [
            {
               name: 'one A'
               link: 'blah/blah',
               pages: []
            },
            {
               name: 'one B'
               link: 'blah/blah',
               pages: []
            },
            {
               name: 'one C'
               link: null,
               pages: [
                   {
                       name: 'one C I'
                       link: 'blah/blah',
                       pages: []
                   }
               ]
            }
        ]
    } 
]

第一级对象可以有链接和页面,嵌套的对象要么有链接要么有页面。我不能假设嵌套的深度有限制。我需要为每个状态创建一个对象,包括它的名称、链接(如果存在)和所有父级。我的当前解决方案无法处理超过3级的嵌套,而添加对每个层次的支持是费力的。
我还需要能够搜索结果对象数组以稍后获取它们的链接,如果这对解决方案有影响的话。
我需要一个JavaScript解决方案,但也可以(并且希望)使用lodash库中包含的函数。

1
我认为最好的方法是编写一个递归函数,将每个嵌套的列表作为参数。如果嵌套列表不为空,则再次调用该函数。 - html_programmer
谢谢,我明白了。但是我不太确定在迭代过程中如何跟踪所有的父级。 - Mark
不确定你的意思。如果你只是循环遍历顶层,然后在子级上调用相同的函数,你将遍历列表中的每个“pages”属性。 - html_programmer
是的,但生成的对象需要包含其所有父级的列表。 - Mark
例如,为“one C I”创建的对象需要一个包含“one C”和“one”作为其父级的属性。 - Mark
1个回答

13

这是一种递归遍历数组的方法:

http://jsfiddle.net/yLnZe/37/

var arrPages = [{
        name: 'one',
        link: 'blah/blah',
        pages: [{
               name: 'one A', 
               link: 'blah/blah',
               pages: []
            },
            {
               name: 'one B', 
               link: 'blah/blah',
               pages: []
            },
            {
               name: 'one C', 
               link: null,
               pages: [{
                       name: 'one C I', 
                       link: 'blah blah',
                       pages: []
                   }]
            }]
    }]; 

function recursiveFunction(collection){ 
    _.each(collection, function(model){ 
        console.log(model); 
        if(model.pages.length > 0){ 
            recursiveFunction(model.pages); 
        }
    }); 
}; 

recursiveFunction(arrPages); 

这是您所需要的吗?或者您需要更具体的内容?根据您最后的评论,我有些困惑您是否需要其他任何东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接