宽带测速网 > 百科知识 >

javascript 数组转成树形结构

在前端开发中,我们常常会遇到将数组转成树形结构的需求。这个需求一般会出现在我们需要将一些数据进行层级展示的情况下,如菜单、目录结构等。在这篇文章中,我们将会讨论javascript中如何将一个数组转成树形结构。

假设我们有以下一个数组:

const array = [{id: 1, parentId: null, label: 'Level 1-1'},{id: 2, parentId: null, label: 'Level 1-2'},{id: 3, parentId: null, label: 'Level 1-3'},{id: 4, parentId: 1, label: 'Level 2-1'},{id: 5, parentId: 1, label: 'Level 2-2'},{id: 6, parentId: 2, label: 'Level 2-3'},{id: 7, parentId: 4, label: 'Level 3-1'},{id: 8, parentId: 6, label: 'Level 3-2'},];

以上数组中,每个元素包含三个属性:id,parentId和label。其中id表示该元素的唯一标识符,parentId表示该元素的父元素的唯一标识符,label表示该元素的名称。如果该元素没有父元素,则其parentId的值为null。

现在我们需要将以上数组转成以下的树形结构:

[{id: 1,label: 'Level 1-1',children: [{id: 4,label: 'Level 2-1',children: [{id: 7,label: 'Level 3-1',children: []}]},{id: 5,label: 'Level 2-2',children: []}]},{id: 2,label: 'Level 1-2',children: [{id: 6,label: 'Level 2-3',children: [{id: 8,label: 'Level 3-2',children: []},]}]},{id: 3,label: 'Level 1-3',children: []}]

我们可以通过以下的代码实现以上的需求:

function convertToTree(data) {const map = {};const result = [];data.forEach(item =>{map[item.id] = item;item.children = [];});data.forEach(item =>{if (item.parentId === null) {result.push(item);} else {map[item.parentId].children.push(item);}});return result;}const result = convertToTree(array)console.log(result)

在以上的代码中,我们定义了一个convertToTree函数,该函数接受一个数组作为参数,返回一个树形结构的数组。首先,我们创建了一个map对象,用于将每个元素的id映射到该元素本身。接着,我们遍历了一遍data数组,将每个元素加入到map对象中,同时也将该元素的children属性初始化为空数组。接下来,我们再次遍历了一遍data数组,对于每个元素,如果其parentId为null,则将该元素加入到根节点数组result中,否则,我们可以通过map对象找到该元素的父节点,并将该节点加入到父节点的children属性数组中。最后返回result数组即可。

除了以上的方法,我们还可以使用递归的方法来将数组转成树形结构,代码如下:

function convertToTree(data, parentId = null) {const result = [];data.forEach(item =>{if (item.parentId === parentId) {item.children = convertToTree(data, item.id);result.push(item);}});return result;}const result = convertToTree(array)console.log(result)

在以上的代码中,我们定义了一个convertToTree函数,该函数接受两个参数:一个是要转换的数组data,另一个是当前节点的parentId。在函数体内,我们首先定义了一个result数组,用于存放当前parentId的子节点数组。接着,我们遍历了一遍data数组,对于每个元素,如果其parentId等于当前的parentId,则将该元素加入到result数组中,并递归调用convertToTree函数,找到该元素的子节点并将其加入该元素的children属性中。最后返回result数组即可。

无论是使用类似map对象的方法还是使用递归的方式,将数组转换成树形结构都是比较常见的操作。希望以上的代码和介绍能够帮助读者更好地理解这一过程。

上一篇:javascript 数组切割

下一篇:ajax保存避免重复提交