> 어떻게 이렇게 평탄한 배열에서 나무 구조를 만들 수 있습니까?
15933 단어 TypeScripttech
interface Chapter {
level: number;
text: string;
}
interface ChapterNode extends Chapter {
children: ChapterNode[];
}
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" },
];
const treefy = (queue: Chapter[], level = 1): ChapterNode[] =>
queue.reduce(
(acc, cur, idx, array) =>
cur.level === level
? acc.concat({
...cur,
children: treefy(
takeWhile((c) => c.level >= level + 1, array.slice(idx + 1)),
level + 1
),
})
: acc,
[] as ChapterNode[]
);
const takeWhile = <T>(func: (head: T) => boolean, accum: T[]): T[] =>
accum.length && func(accum[0])
? [accum[0], ...takeWhile(func, accum.slice(1))]
: ([] as T[]);
console.log(JSON.stringify(treefy(input), null, 2));
$ deno run treefy.ts
[
{
"level": 1,
"text": "1章",
"children": []
},
{
"level": 1,
"text": "2章",
"children": [
{
"level": 2,
"text": "2.1",
"children": []
},
{
"level": 2,
"text": "2.2",
"children": []
}
]
},
{
"level": 1,
"text": "第3章",
"children": [
{
"level": 2,
"text": "3.1",
"children": []
},
{
"level": 2,
"text": "3.2",
"children": [
{
"level": 3,
"text": "3.2.1",
"children": []
},
{
"level": 3,
"text": "3.2.2",
"children": []
}
]
}
]
}
]
Gist
Reference
이 문제에 관하여(> 어떻게 이렇게 평탄한 배열에서 나무 구조를 만들 수 있습니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/ulpianus/articles/6e2916bfaa747e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)