1

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

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

每个人都可以有孩子,每个孩子都可以有任意数量的孩子,依此类推。有谁知道执行此操作的好方法underscore.js

4

2 回答 2

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 来进行树遍​​历。

于 2012-10-05T22:02:11.823 回答
1

抱歉,我不知道下划线的具体含义,但似乎一个简单的递归函数对您来说已经足够简单了。

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);
});
于 2012-10-05T22:05:47.453 回答