一、树形转扁平
递归
- 循环数组,取出每个对象进行判断
- 如果有children属性,将children传到flat函数重复执行,并将执行的结构返回数组,加入到新数组中,然后删除当前对象的children属性
- 不管是否有children属性,都要将当前对象结构,然后加入新数组中
let arr1 = [
{
"id": 1,
"name": "部门1",
"pid": 0,
"children": [
{
"id": 2,
"name": "部门2",
"pid": 1,
"children": []
},
{
"id": 3,
"name": "部门3",
"pid": 1,
"children": [
{
"id": 4,
"name": "部门4",
"pid": 3,
"children": [
{
"id": 5,
"name": "部门5",
"pid": 4,
"children": []
}
]
}
]
}
]
}
]
function flat(arr) {
var newArr = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i].children) {
newArr.push(...flat(arr[i].children));
delete arr[i].children;
}
newArr.push({ ...arr[i] });
}
console.log(newArr);
return newArr;
}
二、扁平转树形
思想:
使用Map来存储不同的id,对应的所在的内存地址,根据对应pid的值,找到你要加入到对象对应的位置
let arr = [
{id: 1, name: '部门1', pid: 0},
{id: 2, name: '部门2', pid: 1},
{id: 3, name: '部门3', pid: 1},
{id: 4, name: '部门4', pid: 3},
{id: 5, name: '部门5', pid: 4},
]
function getTreeData(data){
let treeData = [];
let map = new Map();
let outputObj,pid;
for(let i=0;i<data.length;i++){
pid = data[i].pid
if(map.has(pid)){
if(!map.get(pid).children)
map.get(pid).children = []
let obj = new Object(data[i]);
map.get(pid).children.push(obj);
map.set(data[i].id,obj);
} else if(!map.has(pid) && pid==0){
outputObj = new Object(data[i]); //拷贝
treeData.push(outputObj);
map.set(data[i].id,outputObj);
}
}
return treeData;
}
Map
set()设置键名key对应的键值为value
has()方法返回一个布尔值,表示某个键是否在当前 Map 对象之中
get()读取key对应的键值