ツリー構造を作成するために、構成要素を保持するためのノードクラスを定義します。
Node クラスの定義
Node はツリー構造の1つの構成要素です。 Node は値(nodeValue)と子ノード(childNodes)を保持します。 子ノードは、Node の配列を入れます。
// クラス宣言 class Node { // 子ノードリスト childNodes: null; // ノードの直下の最初の子ノード ※子ノードがなければ null firstChild: null; // ノードの直下の最後の子ノード ※子ノードがなければ null lastChild: null; // ツリー構造で次のノード ※該当するノードがない場合は null nextSibling = null; // ツリー構造で前のノード ※該当するノードがない場合は null previousSibling = null; // Node の名前 nodeName = null; // ノードの型 nodeType = null; // カレントノードの値 nodeValue = null; // ノードの親の Node ※ノードがツリーの最上位である、あるいはツリーに加わっていないなど、親が存在しない場合は null parentNode = null; /** * Represents a node. * @constructor * @param {string} nodeValue - The nodeValue property of the Node interface returns or sets the value of the current node. * @param {string} childNodes - The Node.childNodes read-only property returns a live NodeList of child nodes of the given element where the first child node is assigned index 0. Child nodes include elements, text and comments. */ constructor(nodeValue, childNodes) { this.nodeValue = value; this.childNodes = childNodes; } // カレントノードの最後の子として、指定した childNode 引数を追加します。引数が ツリー上の既存のノードを参照している場合は、ノードが現在の位置から外されて新しい位置に追加されます。 Node appendChild(Node node); // Node を複製します。また、すべての内容物を複製することもできます。デフォルトで、ノードの内容物を複製します。 Node cloneNode(optional boolean deep = false); // ノードが指定したノードの子孫であるか否かを示す Boolean 値を返します。 boolean contains(Node? other); // オブジェクトのルートを返します。 Node getRootNode(optional GetRootNodeOptions options = {}); // 要素が子ノードを持っているか否かを示す Boolean を返します。 boolean hasChildNodes(); // カレントノードの子として、参照先ノードの前に Node を挿入します。 Node insertBefore(Node node, Node? child); // カレントノードの子 Node のひとつを、引数で指定した別のノードで置き換えます。 Node replaceChild(Node node, Node child); // カレント要素から子ノードを削除します。カレント要素はカレントノードの子であることが必要です。 Node removeChild(Node child); }
上記のツリーのデータ構造を表示するためには、以下のコードですべての要素を表示できます。
// ツリー構造を表示 eachNode(tree, ' ', 2); /** * ツリー構造を表示する。 * @param {Node} rootNode ツリー構造オブジェクト * @param {string} textIndent ブロック内のテキストの行の前に置く空白 (字下げ) を設定します。 * @param {number} textIndentLength ブロック内のテキストの行の前に置く空白 (字下げ) の幅を設定します。 */ function eachNode(rootNode, textIndent, textIndentLength) { // インデントを表示 for (let i = 0; i < textIndentLength; i++) { console.log(textIndent); } // 現在のツリー要素の値を表示 console.log(rootNode.nodeValue + "<br />"); // 子ノードがあれば子ノードを表示 if (rootNode.childNodes) { for (let i = 0; i < rootNode.childNodes.length; i++) { // 再帰的に呼び出す eachNode(rootNode.childNodes[i], textIndent, textIndentLength + textIndentLength); } } }