導入組織階層、州、市、郡、動物や植物の分類など、ツリー状のデータ構造によく遭遇します。以下はツリー構造の例です。 実際のアプリケーションでは、特に 1 対多の親/子ノード関係がある場合、この情報を次の構造として保存するのが一般的です。 定数データ = [ { id: 56, 親ID: 62 }, { id: 81, 親ID: 80 }, { id: 74, 親ID: null }, { id: 76, 親ID: 80 }, { id: 63, 親ID: 62 }, { id: 80, 親ID: 86 }, { id: 87, 親ID: 86 }, { id: 62, 親ID: 74 }, { id: 86, 親ID: 74 }, ]; では、このオブジェクト配列形式を階層ツリー形式に変換するにはどうすればよいでしょうか?実際、JavaScript オブジェクト参照の特性を利用すると、実装は非常に簡単です。再帰なしで O(n) 時間で実行できます。 用語 便宜上、まずいくつかの用語を定義しましょう。配列内の各要素 (つまり、ツリー図内の各円) を「ノード」と呼びます。ノードは、複数のノードの「親ノード」になることも、特定のノードの「子ノード」になることもできます。上図では、ノード 86 はノード 80 とノード 87 の「親ノード」であり、ノード 86 はノード 74 の子ノードです。ツリーの最上位ノードは「ルートノード」と呼ばれます。 アイデアツリー構造を構築するには、次のものが必要です。
参照はオブジェクト ツリーに格納されていることがわかります。そのため、このタスクは O(n) 時間で完了できます。 ID配列インデックスのマッピング関係を確立する必須ではありませんが、このマッピング関係により、要素の場所をすばやく見つけ、親要素への参照を見つけやすくなります。 const idMapping = data.reduce((acc, el, i) => { acc[el.id] = i; acc を返します。 }, {}); マッピングの結果は次のようになります。後でその有用性がわかります。
ツリー構造の構築ここで、このツリー構造の構築を開始します。オブジェクトの配列を反復処理し、各要素の親オブジェクトを見つけて、要素への参照を追加します。これで、この idMapping が要素の検索にどれほど便利であるかがわかるはずです (一定時間)。 根付かせる; データ.forEach(el => { // ルートノードを決定する if (el.parentId === null) { ルート = el; 戻る; } // マッピング テーブルを使用して親要素を見つけます const parentEl = data[idMapping[el.parentId]]; // 現在の要素を親要素の `children` 配列に追加します。parentEl.children = [...(parentEl.children || []), el]; }); 終わり! console.log を使用してルートを出力し、次を確認します。 コンソールログ(ルート);
原理なぜこれが可能なのでしょうか?これは、データ配列内の各要素がメモリ内のオブジェクトへの参照であり、forEach ループ内の el 変数が実際にはメモリ内のオブジェクトを指し、parentEl もオブジェクトを参照するためです。 メモリ内のオブジェクトが子配列を参照する場合、これらの子要素も自身の子要素配列を参照できます。これらの関連付けはすべて参照を通じて完了します。 要約するオブジェクト参照は JavaScript の最も基本的な概念の 1 つであり、より多くの学習と理解が必要です。この概念を本当に理解すると、厄介なバグを回避し、一見複雑に見える問題に対して比較的単純な解決策を見つけることができます。 上記は、JavaScript でツリー構造を構築するための効率的なアルゴリズムの詳細についての簡単な説明です。ツリー構造を構築するための JavaScript アルゴリズムの詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。 以下もご興味があるかもしれません:
|
<<: mysql-8.0.11-winx64.zip の詳細なインストール チュートリアル
>>: Linux CentOS 6.5 ifconfig が IP を照会できない問題の解決方法
実際の開発環境や本番環境では、コンテナを独立して実行することはあまりなく、複数のコンテナを一緒に実行...
ソフトウェアのダウンロードソフトウェアのダウンロード リンク: https://pan.baidu....
1. マックヴラン前回のブログ投稿で紹介した Docker コンテナのホスト間通信を実現するための ...
CentOS 8 ではソフトウェア パッケージのインストール プログラムが変更され、yum 構成方法...
問題: MySQL データベースが予期せずクラッシュしたため、データベースを起動できませんでした。エ...
Centos のサーバー側への適用がますます普及するにつれて、Centos7 もますます使用されるよ...
IE6 で試してみたところ、ツールバーが表示されました。オプションに「イメージ ツールバーを有効にす...
目次質問分析する解決するAlert() 関数を置き換えるsetTimeOut関数まとめ質問数日前、J...
情報の最適化と改良は常にデザインの最初のステップです。 「これは百度アライアンスユーザーエクスペリエ...
ユーティリティ = { /** * 死亡年ですか? * @return {Boolse} true...
タイトル通りです!一般的に使用される font-family はブラウザの組み込みフォントを読み込み...
Pantherは新人としてスタートし、今もまだ新人ですが、人々から学び、学んだことを時々皆さんと共有...
まず、テーブルを分割する必要がある理由について説明します。データシートが数百万に達すると、1 回のク...
この記事では、Webオンラインチャットを実装するためのVueの具体的なコードを参考までに紹介します。...
CSS3 では画像の色を変更できます。これからは複数の絵をデザインする必要がなくなり、いつでも修正で...