从JavaScript的平板阵列构建树阵 [英] Build tree array from flat array in javascript

查看:197
本文介绍了从JavaScript的平板阵列构建树阵的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我有JavaScript来使其分层,为了以后建立树来处理复杂的JSON文件。
JSON的每一个入口为:
ID:一个唯一的ID,
parentId的:父节点的ID(它是0,如果该节点是树的根)
级:深度的树中的水平

JSON数据已经是有序的。我的意思是一个条目将有上面本身就是一个父节点或兄弟节点,并根据自身的子节点或兄弟节点。

输入:

  {
    人物:
        {
            ID:12,
            parentId的:0​​,
            文:人
            1级,
            孩子:空
        },
        {
            ID:6,
            parentId的:12,
            文:男孩,
            级别:2,
            孩子:空
        },
                {
            ID:7
            parentId的:12,
            文:其他,
            级别:2,
            孩子:空
        },
        {
            ID:9
            parentId的:0​​,
            文:女人,
            1级,
            孩子:空
        },
        {
            ID:11
            parentId的:9,
            文:女孩,
            级别:2,
            孩子:空
        }
    ]
    动物:
        {
            ID:5,
            parentId的:0​​,
            文:狗,
            1级,
            孩子:空
        },
        {
            ID:8
            parentId的:5,
            文:小狗,
            级别:2,
            孩子:空
        },
        {
            ID:10
            parentId的:13,
            文:猫,
            1级,
            孩子:空
        },
        {
            ID:14,
            parentId的:13,
            文:小猫
            级别:2,
            孩子:空
        },
    ]
}

期望的输出:

  {
    人物:
        {
            ID:12,
            parentId的:0​​,
            文:人
            1级,
            孩子:
                {
                    ID:6,
                    parentId的:12,
                    文:男孩,
                    级别:2,
                    孩子:空
                },
                {
                    ID:7
                    parentId的:12,
                    文:其他,
                    级别:2,
                    孩子:空
                }
            ]
        },
        {
            ID:9
            parentId的:0​​,
            文:女人,
            1级,
            孩子:
            {                ID:11
                parentId的:9,
                文:女孩,
                级别:2,
                孩子:空
            }
        }    ]    动物:
        {
            ID:5,
            parentId的:0​​,
            文:狗,
            1级,
            孩子:
                {
                    ID:8
                    parentId的:5,
                    文:小狗,
                    级别:2,
                    孩子:空
                }
        },
        {
            ID:10
            parentId的:13,
            文:猫,
            1级,
            孩子:
            {
                ID:14,
                parentId的:13,
                文:小猫
                级别:2,
                孩子:空
            }
        }    ]
}


解决方案

这是相当容易的,如果你把所有的节点作为参考的事情。

  VAR节点= [
    {
        ID:12,
        parentId的:0​​,
        文:人
        1级,
        孩子:空
    },{/*...*/}];VAR地图= {},节点,根= [];
对于(VAR I = 0; I< nodes.length; I + = 1){
    节点=节点[I]
    node.children = [];
    图[node.id] =我; //使用地图查找了父母
    如果(node.parentId!==0){
        节点[图[node.parentId] children.push(节点)。
    }其他{
        roots.push(节点);
    }
}
的console.log(根); //< - 有你的树

I have a complex json file that I have to handle with javascript to make it hierarchical, in order to later build a tree. Every entry of the json has : id : a unique id, parentId : the id of the parent node (which is 0 if the node is a root of the tree) level : the level of depth in the tree

The json data is already "ordered". I mean that an entry will have above itself a parent node or brother node, and under itself a child node or a brother node.

Input :

{
    "People": [
        {
            "id": "12",
            "parentId": "0",
            "text": "Man",
            "level": "1",
            "children": null
        },
        {
            "id": "6",
            "parentId": "12",
            "text": "Boy",
            "level": "2",
            "children": null
        },
                {
            "id": "7",
            "parentId": "12",
            "text": "Other",
            "level": "2",
            "children": null
        },
        {
            "id": "9",
            "parentId": "0",
            "text": "Woman",
            "level": "1",
            "children": null
        },
        {
            "id": "11",
            "parentId": "9",
            "text": "Girl",
            "level": "2",
            "children": null
        }
    ],
    "Animals": [
        {
            "id": "5",
            "parentId": "0",
            "text": "Dog",
            "level": "1",
            "children": null
        },
        {
            "id": "8",
            "parentId": "5",
            "text": "Puppy",
            "level": "2",
            "children": null
        },
        {
            "id": "10",
            "parentId": "13",
            "text": "Cat",
            "level": "1",
            "children": null
        },
        {
            "id": "14",
            "parentId": "13",
            "text": "Kitten",
            "level": "2",
            "children": null
        },
    ]
}

Expected output :

{
    "People": [
        {
            "id": "12",
            "parentId": "0",
            "text": "Man",
            "level": "1",
            "children": [
                {
                    "id": "6",
                    "parentId": "12",
                    "text": "Boy",
                    "level": "2",
                    "children": null
                },
                {
                    "id": "7",
                    "parentId": "12",
                    "text": "Other",
                    "level": "2",
                    "children": null
                }   
            ]
        },
        {
            "id": "9",
            "parentId": "0",
            "text": "Woman",
            "level": "1",
            "children":
            {

                "id": "11",
                "parentId": "9",
                "text": "Girl",
                "level": "2",
                "children": null
            }
        }

    ],    

    "Animals": [
        {
            "id": "5",
            "parentId": "0",
            "text": "Dog",
            "level": "1",
            "children": 
                {
                    "id": "8",
                    "parentId": "5",
                    "text": "Puppy",
                    "level": "2",
                    "children": null
                }
        },
        {
            "id": "10",
            "parentId": "13",
            "text": "Cat",
            "level": "1",
            "children": 
            {
                "id": "14",
                "parentId": "13",
                "text": "Kitten",
                "level": "2",
                "children": null
            }
        }

    ]
}

解决方案

This is fairly easy to do if you keep all the nodes as references.

var nodes = [
    {
        "id": "12",
        "parentId": "0",
        "text": "Man",
        "level": "1",
        "children": null
    }, { /*...*/ } ];

var map = {}, node, roots = [];
for (var i = 0; i < nodes.length; i += 1) {
    node = nodes[i];
    node.children = [];
    map[node.id] = i; // use map to look-up the parents
    if (node.parentId !== "0") {
        nodes[map[node.parentId]].children.push(node);
    } else {
        roots.push(node);
    }
}
console.log(roots); // <-- there's your tree

这篇关于从JavaScript的平板阵列构建树阵的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆