JavaScript实现单层数组转多层树结构
作者:函数茶馆时间:2026-10-30 21:08:24浏览:459
本文介绍在JavaScript中将单层一维数组转换为多层嵌套树形结构的方法。针对父ID不固定的场景,通过遍历构建映射表或递归查找的方式,动态组装父子节点关系,适用于Element UI等组件的树形数据需求。
JavaScript实现单层数组转多层树
在许多业务场景中,为了区分用户权限,例如菜单管理或组织机构展示,返回给当前用户的数据往往不以固定的父ID作为根节点标识。
此时,需要根据当前数组的内容动态判断并构造出树形结构。
其核心逻辑是基于父ID,在数组或已构建的树结构中查找对应节点。若在元素中找到匹配的ID,则将其追加为该节点的子元素。
若未找到对应的父节点,则该当前元素即为根级元素。
/**
* 列表转为树,pid值未知。思路:第一遍遍历构造为map,第二遍
* @param {*} list
* @returns
*/
export function listToTree(list) {
let treeData = []
// 第一次遍历,构造一个map
let tmpObj = {}
list.forEach(item => { // 这里也可以把值设置为数组的索引,这样的话在这里可以不必存储这么大空间了
tmpObj[item.id] = item
});
list.forEach(v => {
const parent = tmpObj[v.parentId]
// 如果有parentId并且在临时map中存在
if (v.parentId && parent) {
// 那么把当前元素追加到目标元素children之内,并且把当前key删除
if (!parent.children) {
parent.children = []
}
parent.children.push(v)
} else {
treeData.push(v)
}
})
// 再遍历,根据pid在map中找是否有key,如果有,说明是上级,那么追加到children中;如果没有,那么就跳过,表示没有上级
return treeData;
}JavaScript一维(无嵌套单层)数组转树结构数组(多维嵌套数组)
此方法适用于Element UI的Tree组件,通过比较项中的parentId与其他项的id,若两者相同,则将该项添加到对应id项的children中。
假设有一维数组如下:

期望得到以下数据格式:

首先循环遍历找出祖先级(根节点)的项,然后根据id与parentId的关系,递归获取最终数据:
let newArray = [];
arr.forEach(res => {
if(res.parentId === 0) {
newArray.push(res);
}
});
this.arrToTree(arr, newArray) ;
console.log(newArray); // 最终得到的新数组;
function arrToTree(list, arr) {
arr.forEach(res => {
list.forEach((ret, index) => {
if(res.id === ret.parentId) {
if(!res.hasOwnProperty('children')){
res.children = [];
};
res.children.push(ret);
}
})
if(res.hasOwnProperty('children')) {
this.arrToTree(list, res.children);
}
})
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。
作者最新文章
JS大数值转字符串出现科学计数法怎么办
2026-11-05 17:09:21
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
