gorogoronyan FC2

JavaScript: ツリー構造のデータを扱う (2)

ツリー構造のデータを扱う (1) からの続きです。

ツリーデータを JSON で読み書きする

JSON はツリーオブジェクトをデータファイルなどに保存したり 読んだりするときに便利です。 専用のフォーマットを持つデータファイルに変換するよりも簡単です。 たった 1行のコードで読み書きできます。
JavaScript: JSON シリアライズ

シリアライズとデシリアライズ

JSON の読み書きは、専門用語で シリアライズ (serialize)デシリアライズ (deserialize) と呼ぶこともあります。

シリアライズ   : データの保存に相当する用語
デシリアライズ : データの読み込みに相当する用語
例:
//ツリーノード node を JSON 文字列化する (シリアライズ)
const json = JSON.stringify(node);
//JSON 文字列をツリーノードのオブジェクトに戻す (デシリアライズ)
node = JSON.parse(json);

JSON化したテキストは FileAPI でローカルファイルに保存したり読んだりできます。 テキストファイルを読み書きする話と同じです。
JavaScript ファイル処理 FileAPI

シリアライズできないオブジェクトに注意

ツリーノードの内容によっては JSON シリアライズできない場合があります。 JSON.stringify() の処理でエラーが出ます。

  1. ノードが循環 (ループ) している場合。
    ノードのリンクがループしていて、 子孫のノードが親のノードにつながっている場合。
    ループしたノード
    ループしたノード
    また、ループしたノードは単純な再帰探索を行うと無限ループになるので注意。
  2. ノードがクモの巣状につながっている場合。
    木のように幹から枝分かれする構造ではなく、 一度分かれた枝がまた 1つの幹に戻るようなリンク構造になっている場合。 親のノードが 1つではなく、2つ以上ある場合に相当します。
    クモの巣状のノード
    クモの巣状のノード

いろいろ

ツリーノードを実際にアプリケーションで扱うときに、 Node オブジェクトにシリアライズできないプロパティを一時的につけることも多いです。

例:
1) Node オブジェクトに親のノードの情報を持たせる。
  ノードをたどる処理で便利なので付けることがあります。
  ただし、循環ノードになるので JSON シリアライズするとエラーに
 なります。

2) Node オブジェクトに関連づけられた HTML の li 要素を付ける。
  アプリケーションの GUI 表示で一時的に付けたプロパティ。
  データファイルに保存するオブジェクトではない。

ということで、 Node オブジェクトからシリアライズに必要なプロパティだけ 取り出してシリアライズしたり、デシリアライズで アプリケーション側で必要な初期化処理をすることもあります。 これらの処理は適当な関数やメソッドに追い出して隠蔽します。

関連

inserted by FC2 system