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);
    }
}

wherefunctionToCallは子オブジェクトを取る関数です(例によると)

ツリー トラバーサルを行うために 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 に答える