如何将一个数组转换为树
JS代码
function convert(arr) {
// 用于 id 和 treeNode 的映射
const idToTreeNode = new Map()
let root = null
arr.forEach(item => {
const { id, name, parentId } = item
// 定义 tree node 并加入 map
const treeNode = { id, name }
idToTreeNode.set(id, treeNode)
// 找到 parentNode 并加入到它的 children
const parentNode = idToTreeNode.get(parentId)
if (parentNode) {
if (parentNode.children == null) parentNode.children = []
parentNode.children.push(treeNode)
}
// 找到根节点
if (parentId === 0) {
root = treeNode
}
})
return root
}
const arr = [
{ id: 1, name: '部门A', parentId: 0 }, // 0 代表顶级节点,无父节点
{ id: 2, name: '部门B', parentId: 1 },
{ id: 3, name: '部门C', parentId: 1 },
{ id: 4, name: '部门D', parentId: 2 },
{ id: 5, name: '部门E', parentId: 2 },
{ id: 6, name: '部门F', parentId: 3 }
]
const tree = convert(arr)
console.log(tree)
TS代码
interface IArrayItem {
id:number,
name:string,
parentId:number
}
interface ITreeNode {
id:number,
name:string,
children?:ITreeNode[]
}
function convert(arr:IArrayItem[]):ITreeNode|null{
const idToTreeNode:Map<number,ITreeNode> = new Map();
let root = null;
arr.forEach(item=>{
const {id,name,parentId} = item;
const treeNode:ITreeNode = {id,name};
idToTreeNode.set(id,treeNode)
const parentNode = idToTreeNode.get(parentId);
if(parentNode){
if(parentNode.children == null) parentNode.children = []
parentNode.children.push(treeNode)
}
if(parentId ===0) root = treeNode
})
return root
}
const arr = [
{id:1,name:'部门A',parentId:0},
{id:2,name:'部门B',parentId:1},
{id:3,name:'部门C',parentId:1},
{id:4,name:'部门D',parentId:2},
{id:5,name:'部门E',parentId:2},
{id:6,name:'部门F',parentId:3}
]
const tree = convert(arr);
console.log(tree);
如何将一个树转换为数组
JS代码
function convert1(root){
const nodeToParent = new Map();
const arr = [];
const queue = [];
queue.unshift(root);
while (queue.length > 0) {
const curNode = queue.pop();
if (curNode == null) break;
const { id, name, children = [] } = curNode;
const parentNode = nodeToParent.get(curNode)
const parentId = parentNode?.id || 0
const item = { id, name, parentId };
arr.push(item)
children.forEach(child => {
nodeToParent.set(child, curNode);
queue.unshift(child)
})
}
return arr
}
const obj = {
id: 1,
name: '部门A',
children: [
{
id: 2,
name: '部门B',
children: [
{ id: 4, name: '部门D' },
{ id: 5, name: '部门E' }
]
},
{
id: 3,
name: '部门C',
children: [
{ id: 6, name: '部门F' }
]
}
]
}
const arr1 = convert1(obj);
console.log(arr1);
TS代码
interface IArrayItem {
id: number,
name: string,
parentId: number
}
interface ITreeNode {
id: number,
name: string,
children?: ITreeNode[]
}
function convert1(root: ITreeNode): IArrayItem[] {
const nodeToParent: <ITreeNode, ITreeNode> = new Map();
const arr: IArrayItem[] = [];
const queue: ITreeNode[] = [];
queue.unshift(root);
while (queue.length > 0) {
const curNode = queue.pop();
if (curNode == null) break;
const { id, name, children = [] } = curNode;
const parentNode = nodeToParent.get(curNode)
const parentId = parentNode?.id || 0
const item = { id, name, parentId };
arr.push(item)
children.forEach(child=>{
nodeToParent.set(child,curNode);
queue.unshift(child)
})
}
return arr
}
const obj = {
id: 1,
name: '部门A',
children: [
{
id: 2,
name: '部门B',
children: [
{ id: 4, name: '部门D' },
{ id: 5, name: '部门E' }
]
},
{
id: 3,
name: '部门C',
children: [
{ id: 6, name: '部门F' }
]
}
]
}
const arr1 = convert1(obj);
console.log(arr1);