将从后端获取的数据生成一个树数据
2019-06-18 本文已影响0人
二营长家的张大炮
后端数据如下:
datas: [
{
id: 1,
title: "第1个",
pId: 0
},
{
id: 2,
title: "第2个",
pId: 0
},
{
id: 3,
title: "第3个",
pId: 0
},
{
id: 4,
title: "第4个",
pId: 0
},
{
id: 5,
title: "第1-1个",
pId: 1
},
{
id: 6,
title: "第1-2个",
pId: 1
},
{
id: 7,
title: "第2-1个",
pId: 2
},
{
id: 8,
title: "第3-1个",
pId: 3
},
{
id: 9,
title: "第4-1个",
pId: 4
},
{
id: 10,
title: "第2-2个",
pId: 2
},
{
id: 11,
title: "第3-2个",
pId: 3
},
{
id: 12,
title: "第1-3个",
pId: 1
},
{
id: 13,
title: "第1-1-1个",
pId: 5
},
{
id: 14,
title: "第2-1-1个",
pId: 7
},
{
id: 15,
title: "第3-2个",
pId: 3
},
{
id: 16,
title: "第4-2个",
pId: 4
},
{
id: 17,
title: "第1-1-2个",
pId: 5
},
{
id: 18,
title: "第1-2-1个",
pId: 6
},
{
id: 19,
title: "第2-1-2个",
pId: 7
},
{
id: 20,
title: "第3-1-1个",
pId: 8
},
{
id: 21,
title: "第4-1-1个",
pId: 9
},
{
id: 22,
title: "第2-2-1个",
pId: 10
},
{
id: 23,
title: "第2-2-2个",
pId: 10
},
{
id: 24,
title: "第1-3-1个",
pId: 12
}
]
第一种笨办法(这种你知道这个树有几层才能用):
// 生成一格树
this.datas.forEach(element => {
// 第一层
this.common(this.newdata, element, 0);
});
// 第二层
this.datas.forEach(element => {
this.newdata.forEach(element1 => {
this.common(element1.children, element, element1.id);
});
});
// 第三层
this.datas.forEach(element => {
this.newdata.forEach(element1 => {
element1.children.forEach(element2 => {
if (element1.children.length !== 0) {
this.common(element2.children, element, element2.id);
}
});
});
});
第二种方法(不论多少层):
let formatObj = this.datas.reduce((pre, cur) => {
return { ...pre, [cur["id"]]: cur };
}, {});
let formatArray = this.datas.reduce((arr, cur) => {
console.log('arr',arr);
// 获取当前元素的pId 如果没有则设为0 如果有则获取其pId
let pId = cur.pId ? cur.pId : 0;
let parent = formatObj[pId];
// 这里的parent是当前元素的pId 如果不为0 则代表它是某个分支的子集
if (parent) {
// 判断当前分支的children数组是否为[] 如果为[]则将当前元素赋值给该数组 如果不为[]则push
parent.children ? parent.children.push(cur) : (parent.children = [cur]);
} else {
// 这是pId为0的情况
arr.push(cur);
}
return arr;
}, []);
this.newdata = formatArray;
如果碰到解析不了es6语法的情况
安装下面的依赖:
npm install --save-dev babel-preset-stage-0
配置:
babelrc文件:
{
"presets": ["stage-0"],
"plugins": [
"transform-vue-jsx",
[
"transform-runtime", {
"helpers": false,
"polyfill": false,
"regenerator": true,
"moduleName": "babel-runtime"
}
]
]
}
image.png