평탄한 배열로 나무의 구조를 이루다
11309 단어 TypeScriptidea
const input = [
{ level: 1, text: '1章' },
{ level: 1, text: '2章' },
{ level: 2, text: '2.1' },
{ level: 2, text: '2.2' },
{ level: 1, text: '第3章' },
{ level: 2, text: '3.1' },
{ level: 2, text: '3.2' },
{ level: 3, text: '3.2.1' },
{ level: 3, text: '3.2.2' },
]
type TreeNode<I> = Omit<I, 'children'> & { children?: TreeNode<I>[] }
type Input<I> = (I & { children: unknown })[]
const treefy = <I extends { level: number }>(input: I[]) => {
const tree: TreeNode<I>[] = []
const last: TreeNode<I>[] = []
let top = -1
let bottom = -1
for (const { children: _, ...item } of input as Input<I>) {
if (top < item.level && item.level <= bottom + 1) {
const idx = item.level - top
bottom = item.level
;(last[idx - 1].children ??= []).push(item)
last[idx] = item
continue
}
tree.push(item)
last[0] = item
top = bottom = item.level
}
return tree
}
const output = treefy(input)
console.log(JSON.stringify(output, null, 2))
TS Playground 해설
for문 플러그인과 array #pop 등을 사용하지 않으면 가벼워질 것 같습니다.
level은 한 번에 2개 이상 늘지 않는다는 전제로 쓰기 때문에 그게 망가지면 이것도 망가질 수 있어요.
Reference
이 문제에 관하여(평탄한 배열로 나무의 구조를 이루다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/rithmety/articles/20210511-treefy텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)