迭代数组,未知数量的子级别为underscore.js

时间:2012-10-05 21:57:53

标签: javascript arrays underscore.js

我有一个像这样的对象数组:

[{
name: "Peter",
childs: [{
    name: "John",
    childs: [{
        name: "Joseph",
        childs: []
    }]
}]
},
{
    name: "Carl",
    childs: [{
        name: "Sam",
        childs: []
    }]
}]

每个人都可以生育孩子,每个孩子都可以有多个孩子等等。有谁知道在underscore.js上执行此操作的好方法?

2 个答案:

答案 0 :(得分:3)

看起来你问的是如何进行树遍历,而不是像underscore.js那样独特。您可以通过这种方式进行深度优先遍历:

var children = [{name: "Peter", childs: [...]}, ...]
function traverseAndPrint(tree) {
    for (var i = 0; i < tree.length; i++) {
        console.log(tree[i].name);
        traverseAndPrint(tree[i].childs);
    }
}

如果您需要对每个元素执行任意操作,您可以执行以下操作:

function traverseAndCallFunction(tree, functionToCall) {
    for (var i = 0; i < tree.length; i++) {
        functionToCall(tree[i]);
        traverseAndPrint(tree[i].childs);
    }
}

其中functionToCall是一个接受子对象的函数(根据您的示例)

我不明白为什么你需要使用underscore.js进行树遍历。

答案 1 :(得分:0)

很抱歉,我不知道下划线有多具体,但似乎一个简单的递归函数对你来说很容易。

var data = [{ 
   name: "Peter",
   childs: [{
       name: "John",
       childs: [{
           name: "Joseph",
           childs: []
       }]
   }, { 
       name: "Carl",
       childs: [{
           name: "Sam",
           childs: []
       }]
   }]
}];

function trav(data, fn) {
    data.forEach(function(item) {
        for (var p in item)
            if (p === "childs")
                trav(item[p], fn);
            else
                fn(item[p], p);
    });
}

trav(data, function(val, prop) {
    console.log(prop, val);
});