interface ArrayTreeOptions {
list: any[];
pid?: number|string;
parentIdKey?: string;
key?:string;
level?:number;
eliminateKey?:any|null;
eliminateValue?:any|null;
holdParent?:boolean;
levelLimit?:any|null
}
/**
* 构造树型结构数据
* @param {*} list 数据源
* @param {*} pid 默认 0
* @param {*} parentIdKey 父节点字段 默认 'parentId'
* @param {*} key 节点字段 默认 'id'
* @param {*} level 层级
*/
export const arrayToTree=<T>({
list=[],
pid=0,
parentIdKey="parentId",
key='id',
level=0}:ArrayTreeOptions):T[]=>{
const childrenListMap: any = {};
const nodeIds: any = {};
const tree: T[] = [];
for (const d of list) {
const parentId = d[parentIdKey];
if (childrenListMap[parentId] == null) {
childrenListMap[parentId] = [];
}
d['level'] = level;
nodeIds[d[key]] = d;
childrenListMap[parentId].push(d);
}
for (const d of list) {
const parentId = d[parentIdKey];
if (nodeIds[parentId] === undefined) {
// console.log(nodeIds[parentId],d)
tree.push(d);
}else{
// console.log('nodeIds[parentId]',nodeIds[parentId])
}
}
const adaptToChildrenList = (o: any,level:number=0) => {
level++
if (childrenListMap[o[key]] !== null) {
o['children'] = childrenListMap[o[key]];
}
if (o['children']) {
for (const c of o['children']) {
c['level'] = level
adaptToChildrenList(c,level);
}
}
};
for (const t of tree) {
adaptToChildrenList(t,level);
}
return tree;
}
将数组装换成tree ,parentId 不确定
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 目标: JS 将有父子关系的平行数组转换成树形数据 方法一:双重遍历,一次遍历parentId,一次遍历id ==...
- 题目三: 2.23如果一个数组A[1...n]中超过半数的元素都相同时,该数组被称为含有一个主元素。给定一个数组,...