当前位置: 首页 > 面试题库 >

从JavaScript中的平面数组构建树数组

谷梁波
2023-03-14
问题内容

我有一个复杂的json文件,必须使用javascript处理才能使其具有层次结构,以便稍后构建树。json的每个条目都具有:id:唯一ID,parentId:父节点的id(如果节点是树的根,则为0)level:树中的深度级别

json数据已被“排序”。我的意思是,条目上方将具有父节点或兄弟节点,而其下将具有子节点或兄弟节点。

输入:

{
    "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
        },
    ]
}

预期产量:

{
    "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
            }
        }

    ]
}

问题答案:

如果使用地图查找,则有一个有效的解决方案。如果父母总是先于孩子,则可以合并两个for循环。它支持多个根。它在悬垂的分支上给出错误,但可以修改以忽略它们。它不需要第三方库。据我所知,这是最快的解决方案。

function list_to_tree(list) {
    var map = {}, node, roots = [], i;
    for (i = 0; i < list.length; i += 1) {
        map[list[i].id] = i; // initialize the map
        list[i].children = []; // initialize the children
    }
    for (i = 0; i < list.length; i += 1) {
        node = list[i];
        if (node.parentId !== "0") {
            // if you have dangling branches check that map[node.parentId] exists
            list[map[node.parentId]].children.push(node);
        } else {
            roots.push(node);
        }
    }
    return roots;
}

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

console.log(list_to_tree(entries));

如果您对复杂性理论感兴趣,则此解为Θ(n log(n))。递归滤波器的解决方案是Θ(n ^ 2),这对于大数据集可能是个问题。



 类似资料:
  • 我有一个复杂的json文件,我必须用javascript处理它,使它具有层次结构,以便以后构建一个树。json的每个条目都有:id:唯一的id,parentId:父节点的id(如果节点是树的根,则为0)level:树中的深度级别 json数据已经“有序”了。我的意思是,一个条目的上面有一个父节点或兄弟节点,下面有一个子节点或兄弟节点。 输入: 预期产出:

  • 问题内容: 我环顾了互联网,但还没有完全找到想要的东西。我有一个平面数组,每个元素包含一个“ id”和一个“ parent_id”。每个元素只有一个父元素,但可能有多个子元素。如果parent_id = 0,则将其视为根级项目。我正在尝试将平面阵列变成一棵树。我发现的其他示例仅将元素复制到父元素,但原始元素仍然存在。 编辑 起始数组的每个元素都是从单独的XML文件中读取的。如果文件本身没有父文件,

  • 我想从平面数组构建一个树形数组: 下面是平面数组: NB:id=节点id;pid=父节点id。 我想将其转换为这个数组: 我试图使用递归函数来实现预期的结果,但我正在寻找更好的方法。谢谢你的回复。

  • 问题内容: 我有一个像这样的清单: 但是更大了,所以我需要一种有效的方法来使它变成像这样的树: 我不能使用诸如嵌套集之类的东西,也不能使用诸如becoas之类的东西,因为我可以在数据库中添加左右值。有任何想法吗? 问题答案: 哦,这就是我解决的方法:

  • 我想写一个函数,可以对给定的数组进行深度展平。例如: 我尝试递归地解决这个问题,到目前为止,我得到了: 然而,这只会将非数组元素推向结果,并完全忽略串联部分。我该如何解决这个问题,或者有没有更好的方法来编写这个函数,而无需任何外部库的帮助?

  • 背景: 需要将扁平化数组转换成树形数组。 比如原始数组如下: 期望转换后的数据