用了好久的也有好些次的树形数据相关的内容,隔段时间还是不能立马想起来。
将树形数据扁平化(树形数据转化为一维数组)
- 树形数据如下
let treeData = [
{
id: 1,
name: 1,
chidren: [
{
id: 11,
name: 11,
chidren: [
{
id: 111,
name: 111,
},
{
id: 112,
name: 112,
},
],
},
{
id: 12,
name: 12,
},
],
},
{
id: 2,
name: 2,
},
];
- 方法一
getFlat = (treeData) => {
let treeList = [];
const func = (tree) => {
for (let i = 0; i < tree.length; i++) {
treeList.push(tree[i]);
if (tree[i].chidren) {
func(tree[i].chidren);
delete tree[i].chidren;
}
}
};
func(treeData)
return treeList
};
- 方法二
getFlat = (treeData) => {
let treeList = [];
const func = (tree) => {
tree.forEach((item) => {
treeList.push(item);
if (item.chidren) {
func(item.chidren);
delete item.chidren;
}
});
};
func(treeData);
return treeList;
};
- 方法三
getFlat = (tree) => {
let treeList = [];
const func = (tree) => {
tree.forEach((item) => {
let temp = { ...item }; // 将原数据拷贝一份
delete temp["chidren"]; // 删除chidren属性
treeList.push(temp);
if (item.chidren) {
func(item.chidren);
}
});
};
func(treeData);
return treeList;
};
- 方法四
getFlat = (tree) => {
let args = [];
let result = [];
args = _.concat(args, tree);
while (args.length) {
let first = args.shift();
if (first.chidren) {
args = _.concat(args, first.chidren);
delete first["chidren"];
}
result.push(first);
}
return result;
};
构建树形结构数据(将一维数组转化成树形数据)
let treeList = [
{ id: 1, name: 1, pId: 0 },
{ id: 11, name: 11, pId: 1 },
{ id: 111, name: 111, pId: 11 },
{ id: 112, name: 112, pId: 11 },
{ id: 12, name: 12, pId: 1 },
{ id: 2, name: 2, pId: 0 },
];
- 方法一
getTreeData = (treeList) => {
for (let i = 0; i < treeList.length; i++) {
for (let j = i + 1; j < treeList.length; j++) {
if (treeList[i].id === treeList[j].pId) {
if (!treeList[i].chidren) {
treeList[i].chidren = [];
}
treeList[i].chidren.push(treeList[j]);
}
}
}
return treeList.filter((item) => item.chidren);
};
- 方法二
getTreeData = (treeList, id = 0) => {
let treeData = [];
treeList.forEach((item) => {
if (item.pId === id) {
let temp = treeList.filter((v) => v.pId !== id); // 过滤掉已循环的数据进行递归
const chidren = this.getTreeData(temp, item.id);
if (chidren.length) {
treeData.push({ ...item, chidren });
} else {
treeData.push(item);
}
}
});
return treeData;
};
- 方法三
getTreeData = (treeList) => {
let obj = {};
treeList.forEach((item) => {
if (!obj[item.id]) {
obj[item.id] = item;
}
});
treeList.forEach((item) => {
if (item.pId !== 0) {
obj[item.pId].chidren
? obj[item.pId].chidren.push(item)
: (obj[item.pId].chidren = [item]);
}
});
return treeList.filter((item) => item.pId === 0);
};
- 方法四
getTreeData = (treeList) => {
let obj = {};
let treeData = [];
treeList.forEach((item) => {
if (!obj[item.id]) {
obj[item.id] = item;
}
});
treeList.forEach((item) => {
if (obj[item.pId]) {
if (!obj[item.pId].chidren) {
obj[item.pId].chidren = [];
}
obj[item.pId].chidren.push(item);
} else {
treeData.push(item);
}
});
return treeData;
};
获取树形数据以id作为key,下标为value(例: {1:0,11:0-0,12:0-1,2:1})的对象集合
getPathObj = (treeData) => {
let pathObj = {}
const func = (tree, parentIndex = "") => {
tree.forEach((item, i) => {
const index = parentIndex !== "" ? parentIndex + "-" + i : i.toString();
pathObj[item.id] = index;
if (item.chidren && item.chidren.length) {
func(item.chidren, i);
}
});
};
func(treeData);
return pathObj;
};