【TypeScript】フラットなデータ構造をdepthによってネストしたデータ構造にする
はじめに
ネストしたデータ構造をフラットなデータにする記事は検索すれば、たくさん出てきます。
しかし、フラットなデータをネストしたデータに変換するような記事はなかなか見当たりません。
今回はどのようにしてコードで実現するのかを、TypeScriptを使って考えてみようと思います。
成果物
https://github.com/kntks/blog-code/tree/main/2023/03/generate-nested-array
入力と求める出力
入力は深さと、名前を持ったオブジェクトの配列です。
入力データのルールは、
- 親は子よりも配列のインデックスが小さい
- 必ず木構造になる
イメージ図は以下の通りです。
求める結果は以下の通りです。
結論
実装
はじめにtypeを定義します。
TypeScript 3.7以降からRecursive Typeが使えるので、これを利用します。
参考:
- (More) Recursive Type Aliases - TypeScript 3.7
- How to represent nested array with typescript - stackoverflow
generateNestedArrayの中を見てみる
実装のアイデアは深さ優先探索
と同じです。
引数に渡された配列を上から順に見ていき、訪問済みかどうかを確認します。
テストを書いて動作確認してみる
実装が完了したので、実際にテストを書いて挙動が正しいか確認します。
どうやら意図した挙動になっていそうです!
最後に
再帰関数を使うことで、ネストしたデータを作成できることがわかりました。しかし、挙動を把握するためにはしっかりコードを読む必要があります。個人的な意見ですが、もしforで実現できるのならば、再帰関数よりもfor文を選択した方が良いです。
参考になれば幸いです。