1

私はJSONツリー構造を持っています:

nodes = 
[
{
    "name": "user1",
    "children": [
        {
            "name": "user2"
        },
        {
            "name": "user3",
            "children": [
                {
                    "name": "user4"
                }
            ]
        },
        {
            "name": "user5"
        }
    ]
}
]

親リンク構造に変換したい:

[{"name": "user1","parent": "null"},
 {"name": "user2","parent": "user1"},
 {"name": "user3","parent": "user1"},
 {"name": "user4","parent": "user3"},
 {"name": "user5","parent": "user1"}]

ツリーを再帰的にトラバースしようとしましたが、親オブジェクトへのアクセスに成功しませんでした:

rebuild(nodes,parentLink);

function parentlink(key,value) {
    var obj = { name: value , parent: ??? };
    if (key == "name"){
        nodes.push(obj);
    }
}

function rebuild(o,func) {
    for (i in o) {
        func.apply(this,[i,o[i]])
      if (typeof(o[i])=="object") {
        traverse(o[i],func,nodes);
      }
    }
}

開発者ツールでは、各子の親オブジェクトを確認できますが、それらにアクセスする方法がわかりません。各ユーザーに親を追加するにはどうすればよいですか?

4

1 に答える 1

3

私はうそをつくつもりはありません、私はあなたのコードを見ることを気にしませんでした-これは私がそれを行う方法です:

http://jsfiddle.net/J6G2W/1/

function processChildren(item, ret, parent) {
    for (var i = 0; i < item.length; i++) {
        var cur = item[i];
        var cur_name = cur.name;
        ret.push({"user": cur_name, "parent": parent});
        if ("children" in cur && cur.children.length > 0) {
            processChildren(cur.children, ret, cur_name);
        }
    }
}

var all = [];

processChildren(nodes, all, null);

console.log(JSON.stringify(all));

出力は次のとおりです。

[{"user":"user1","parent":null},{"user":"user2","parent":"user1"},{"user":"user3","parent":"user1"},{"user":"user4","parent":"user3"},{"user":"user5","parent":"user1"}]

あなたが探しているもののようです。あなたのコードのどの部分をあなたのコードのように動作するように変更してもかまいません。

更新

何らかの理由で、より拡張可能にしたい場合は、どのキーが「名前」で、どのキーが「子」であるかをカスタマイズできます...例:

http://jsfiddle.net/J6G2W/2/

function startProcess(item, ret, key_look, children_look, parent) {
    function processChildren(item2, ret2, parent2) {
        for (var i = 0; i < item2.length; i++) {
            var cur = item2[i];
            var cur_name = key_look in cur ? cur[key_look] : null;

            ret.push({"user": cur_name, "parent": parent2});
            if (children_look in cur && cur[children_look].length > 0) {
                processChildren(cur[children_look], ret, cur_name);
            }
        }
    }

    processChildren(item, ret, parent);
}

var all = [];

startProcess(nodes, all, "name", "children", null);

console.log(JSON.stringify(all));

key_look, children_look引数を一度だけ指定する必要があることに注意してください。内部関数は、再帰ごとに重要なものだけを渡しながら、これらのパラメーターにアクセスできます。これはおそらく重要ではありません。私はそれを理解したかっただけです:)

于 2012-11-02T19:16:05.640 に答える