/**
*
* @param {Array} data
* @param {string} pid 子树找父级的标识,这里面默认子树的标识为id,如果不为id,就再传一个子树id标识
* @param {string} child 自定义子树字段名称
* @returns
*/
export function makeTree(data,pid,child){
let parents = data.filter(p => p[pid] === '0' ),
children = data.filter(c => c[pid] !== '0');
dataToTree(parents, children);
return parents;
function dataToTree(parents, children){
parents.map(p => {
children.map((c, i) => {
if(c[pid] === p.unionId){
let _children = JSON.parse(JSON.stringify(children));
_children.splice(i, 1);
dataToTree([c], _children);
if(p[child]){
p[child].push(c);
}else{
p[child] = [c];
}
}
})
})
}
}
/**
*
* @param {Array} arrs 树形数据
* @param {string} childs 树形数据子数据的属性名,常用'children'
* @param {Array} attrArr 需要提取的公共属性数组(默认是除了childs的全部属性)
* @returns
*/
export function extractTree(arrs,childs,attrArr){
let attrList = [];
if(!Array.isArray(arrs)&&!arrs.length)return [];
if(typeof childs !== 'string')return [];
if(!Array.isArray(attrArr)||Array.isArray(attrArr)&&!attrArr.length){
attrList = Object.keys(arrs[0]);
attrList.splice(attrList.indexOf(childs), 1);
}else{
attrList = attrArr;
}
let list = [];
const getObj = (arr)=>{
arr.forEach(function(row){
let obj = {};
attrList.forEach(item=>{
obj[item] = row[item];
});
list.push(obj);
if(row[childs]){
getObj(row[childs]);
}
})
return list;
}
return getObj(arrs);
}
// 递归查找子集
function transferArr2Tree(data, pid = 0) {
const result = []
data.forEach(item => {
if (item.pid === pid) {
item.chidlren = transferArr2Tree(data, item.id)
result.push(item)
}
})
return result
}
function transferTree2Arr(arr) {
let res = []
for(const item of arr) {
res.push(item)
if (item.chidlren && !!item.chidlren.length) {
res = res.concat(transferTree2Arr(item.chidlren))
}
}
return res
}
// 数组的扁平化
function flatten(arr) {
let result = []
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]))
} else {
result.push(arr[i])
}
}
return result
}