有人问了随手写了一个
type Item = {
id: string
pid: string
name: string
children?: Item[]
}
function transMap(list: Item[]) {
const childMap = new Map<string, Item[]>()
const result: Array<Item> = []
for (let i = 0; i < list.length; i++) {
const item = list[i]
if (item.pid) {
const _children_ = childMap.get(item.pid) || []
childMap.set(item.pid, _children_.concat(item))
} else {
result.push(item)
}
}
function loop(list: Item[]) {
list.map((v) => {
const children = childMap.get(v.id) || []
if (children.length) {
v.children = children
loop(children)
}
return v
})
}
loop(result)
return result
}
const formatId = (i = 0) => ('000000' + (i + 1)).slice(-6)
const arr: Item[] = []
for (let i = 0; i < 20000; i++) {
const id = formatId(i)
const pid = i > 10 ? formatId(Math.floor(Math.random() * i)) : ''
arr.push({
id,
pid,
name: id,
})
}
console.time('transMap')
const result = transMap(arr)
console.timeEnd('transMap')
2万数据处理速度基本在16ms左右