数组与树之间的转换
在很多业务场景中,时常需要我们将一个树形结构的数据转换成数组遍历,亦或者一个数组数据拼接成一个树形结构。因此封装了一下方法,这里使用的是递归加深拷贝。如果树形结构不复杂,也可以考虑不断使用 for 循环。不过这里优先使用递归:
js
//树转换为数组
treeToArr(list) {
let tree = list;
var arr = [];
function spread(tree, parentId) {
for (var i = 0; i < tree.length; i++) {
let item = tree[i];
let obj = JSON.parse(JSON.stringify(tree[i])); // 深拷贝
let { id, name } = obj;
let children = obj.children;
let maxlength =
obj.children && obj.children.length ? obj.children.length : 0;
arr.push({ id, name, parentId, maxlength, children });
if (item.children) {
spread(item.children, item.id);
delete item.children;
}
}
}
spread(tree, 0);
return arr;
},当然,这里的赋值算法可以根据实际情况进行调整,重要的是递归思想。
js
// 数组转换为树
arrToTree(list, rootValue) {
const deepList = JSON.parse(JSON.stringify(list)); // 深拷贝
const arr = [];
deepList.forEach((item) => {
if (item.parentId === rootValue) {
const children = arrToTree(deepList, item.id);
children.length ? (item.children = children) : false;
// item.children = children // 如果希望每个item都有children属性, 可以直接赋值
arr.push(item);
}
});
return arr;
},