1

フォルダーとメールという 2 つの関連オブジェクトを Web サービスから取得しています。フォルダーには ID と、フォルダーがネストされている親フォルダーを示す parentfolder.ID プロパティがあります。電子メールには、それがどのフォルダの子であるかを示す CategoryID があります。

フラットなフォルダー構造内にメールをネストする機能を正常に作成しました。

{
"folders": [
    {
        "name": "my emails",
        "type": "folder",
        "additionalParameters": {
            "id": "174661",
            "type": "email",
            "parentID": "0"
        },
        "children": [
            {
                "name": "Test1",
                "type": "item",
                "additionalParameters": {
                    "id": "27502",
                    "subject": "Test"
                }
            },
            {
                "name": "Hello",
                "type": "item",
                "additionalParameters": {
                    "id": "27917",
                    "subject": "Hi!"
                }
            }
        ]
    },
    {
        "name": "Test",
        "type": "folder",
        "additionalParameters": {
            "id": "175620",
            "type": "email",
            "parentID": "174661"
        },
        "children": [
            {
                "name": "Test2",
                "type": "item",
                "additionalParameters": {
                    "id": "27891",
                    "subject": "Test"
                }
            }
        ]
    },
    {
        "name": "SubFolder1",
        "type": "folder",
        "additionalParameters": {
            "id": "175621",
            "type": "email",
            "parentID": "175620"
        },
        "children": [
            {
                "name": "Test2",
                "type": "item",
                "additionalParameters": {
                    "id": "27892",
                    "subject": "Test"
                }
            },
            {
                "name": "Test3",
                "type": "item",
                "additionalParameters": {
                    "id": "27893",
                    "subject": "Test"
                }
            }
        ]
    },
    {
        "name": "SubFolder2",
        "type": "folder",
        "additionalParameters": {
            "id": "175622",
            "type": "email",
            "parentID": "175620"
        },
        "children": [
            {
                "name": "Test4",
                "type": "item",
                "additionalParameters": {
                    "id": "27894",
                    "subject": "Test"
                }
            }
        ]
    }
]
}

ここで、再帰を使用してすべてのフォルダーをループし、それらを親の子配列にプッシュする必要があります。基本的に、ツリーを n レベルに再分類します。type=itemsは既に適切にネストされているため、無視できます。タイプがfolderのものをソートするだけです。

ネストされた JSON オブジェクトを再構築するために JSON 再帰関数を実装した人はいますか?

助けてくれてありがとう。

4

2 に答える 2

2

これは再帰なしで実行できます。以前、似たような質問に答えました。同じアプローチを使用できると思います(前方参照がない場合):

var idToNodeMap = {}; //Keeps track of nodes using id as key, for fast lookup
var root = null; //Initially set our root to null

//loop over data
for(var i = 0; i < data.folders.length; i++) {
    var folder = data.folders[i];

    //each node will have children, so let's give it a "children" poperty
    folder.children = [];

    //add an entry for this node to the map so that any future children can
    //lookup the parent
    idToNodeMap[folder.additionalParameters.id] = folder;

    //Does this node have a parent?
    if(folder.additionalParamters.parentID === "0") {
        //Doesn't look like it, so this node is the root of the tree
        root = folder;        
    } else {        
        //This node has a parent, so let's look it up using the id
        parentNode = idToNodeMap[folder.additionalParamters.parentID];    

        //Let's add the current node as a child of the parent node.
        parentNode.children.push(folder);        
    }
}
于 2013-07-09T20:11:03.370 に答える
0

ビビンのおかげです。彼の答えを介して、最終的に機能するアプローチへのリンクを見つけました。最終的なコードは次のとおりです。

var arr = $this.folderArray;
                        // Define root
                        console.log("arr");
                        console.log(arr);

                        // Define tree
                        var tree = {
                            root: root
                        };
                        console.log('tree');
                        console.log(tree);
                        // Get parent of node (recursive)
                        var getParent = function (rootNode, rootId) {
                            console.log('rootnode');
                            console.log(rootNode);
                            console.log('rootId');
                            console.log(rootId);
                            if (rootNode.additionalParameters.id === rootId)
                                return rootNode;

                            for (var i = 0; i < rootNode.children.length; i++) {
                                var child = rootNode.children[i];
                                if (child.additionalParameters.id === rootId) return child;

                                if(child.children){
                                    if (child.children.length > 0){
                                        var childResult = getParent(child, rootId);
                                        if (childResult != null) return childResult;
                                    }
                                }

                            }
                            return null;
                        };


                        // Traverse data and build the tree
                        var buildTree = function(tree) {
                            for (var i = 0; i < arr.length; i++) {
                                var elem = arr[i];
                                if (elem.additionalParameters.parentID === "0")
                                    continue;
                                //elem["children"] = [];

                                var rootId = elem.additionalParameters.parentID;
                                var parent = getParent(tree.root, rootId);
                                console.log("parent");
                                console.log(parent);
                                parent.children.push(elem);

                                // Debug info
                               // console.log("Elem: " + elem.name + " with parent_id: " + elem.parentAreaRef.id);
                                //console.log("Got parent with name: " + parent._id);
                            }
                        };
                        buildTree(tree);
于 2013-07-09T20:49:43.790 に答える