평탄한 배열로 나무의 구조를 이루다

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개 이상 늘지 않는다는 전제로 쓰기 때문에 그게 망가지면 이것도 망가질 수 있어요.

좋은 웹페이지 즐겨찾기