/**
* 把扁平数据转成树型结构数据(可以实现无限层级树形数据结构,只适用于单个表的数据)
* @param source 源数据
* @param id 对应id字段名称
* @param parentId 对应parentId字段名称
* @param children 对应children字段名称
*/
Vue.prototype.$treeDataFormat = function(source, id, parentId, children){
let cloneData = JSON.parse(JSON.stringify(source)); // 对源数据深度克隆
return cloneData.filter(father=>{ // 循环所有项,并添加children属性
let branchArr = cloneData.filter(child => father[id] == child[parentId]); // 返回每一项的子级数组
branchArr.length>0 ? father[children] = branchArr : '' //给父级添加一个children属性,并赋值
return father[parentId] == 0 // 如果第一层不是parentId=0,请自行修改
})
},
/**
* 把树型结构数据转成扁平数据(跟treeDataformat方法相反)
* @param newSource 新数据
* @param source 源数据
* @param children 子集字段名称
* @param name 名称字段名称(非必传) 用于导出返回数据名称显示树形
* @param lvl 等级(非必传) 用于导出返回数据名称显示树形
*/
Vue.prototype.$treeDataToCompressed= function(newSource,source,children,name,lvl) {
for (let i in source) {
if(name && lvl){
source[i][name] = (Array(lvl+1).join(" ") + source[i][name]).slice(-(source[i][name].length+lvl));
}
let cloneData = JSON.parse(JSON.stringify(source[i]));
delete cloneData[children];
newSource.push(cloneData);
if(source[i][children] && source[i][children].length > 0){
this.$treeDataToCompressed(newSource,source[i][children],children,name,lvl+1)
}
}
}