ある記事では、分岐最適化の場合に JavaScript を実装する方法を説明しています。
1000の判定条件には1000のifを書く必要がある? if 分岐ステートメントを最適化するにはどうすればよいですか?次の記事ではブランチの最適化を実現する方法について説明しますので、皆様のお役に立てれば幸いです。
最近、インターネットサーフィン中に次のコードを見つけました:
function getUserDescribe(name) { if (name === "小刘") { console.log("刘哥哥"); } else if (name === "小红") { console.log("小红妹妹"); } else if (name === "陈龙") { console.log("大师"); } else if (name === "李龙") { console.log("师傅"); } else if (name === "大鹏") { console.log("恶人"); } else { console.log("此人比较神秘!"); } }
一見したところ、何も異常を感じませんでしたが、もし何か異常がある場合は、判定条件が1000個、この書き方だとif
分岐を1000個書くのは難しいでしょうか?
多数の if
ブランチを記述し、ブランチ 内に ブランチも存在する可能性がある場合、コード全体の可読性と保守性が低下すると想像できます。実際の開発ではこれが頭の痛い問題ですが、これらの問題を回避しながら要件を達成する方法はあるのでしょうか? [推奨学習: JavaScript ビデオ チュートリアル ]
1️⃣ 簡単なブランチの最適化
これには ブランチの最適化 が含まれます。変更しましょう私たちの考え方と上記のコード構造を最適化します。
function getUserDescribe(name) { const describeForNameMap = { 小刘: () => console.log("刘哥哥"), 小红: () => console.log("小红妹妹"), 陈龙: () => console.log("大师"), 李龙: () => console.log("师傅"), 大鹏: () => console.log("恶人"), }; describeForNameMap[name] ? describeForNameMap[name]() : console.log("此人比较神秘!"); }
問題コード内の判定はすべて単純な 均等判定 であるため、これらの判定条件をオブジェクト の属性として記述することができます。 descriptionForNameMap
、これらの属性に対応する値が条件成立後の処理関数となります。
その後は、getUserDescribe
関数で受け取ったパラメーターを通じて、describeForNameMap
オブジェクト内の対応する値を取得するだけです。値が存在する場合は、その値を実行します。 (値は関数であるため)。
このように、元の if
分岐判定は、単純な key value
対応値に変換され、条件と処理関数が 1 対 1 に対応して明確になります。一目でわかる。
2️⃣ 複雑な分岐の最適化
次に、if
分岐の判定条件が単純な等価判定だけではなく、いくつかの計算を含んでいるとします。計算する必要がある式が次の場合はどうすればよいですか? (以下に示すように)
function getUserDescribe(name) { if (name.length > 3) { console.log("名字太长"); } else if (name.length < 2) { console.log("名字太短"); } else if (name[0] === "陈") { console.log("小陈"); } else if (name[0] === "李" && name !== "李鹏") { console.log("小李"); } else if (name === "李鹏") { console.log("管理员"); } else { console.log("此人比较神秘!"); } }
この構造のコードでは、分岐最適化のためにオブジェクトを導入できません。分岐最適化のために 2 次元配列 を導入できます:
function getUserDescribe(name) { const describeForNameMap = [ [ (name) => name.length > 3, // 判断条件 () => console.log("名字太长") // 执行函数 ], [ (name) => name.length < 2, () => console.log("名字太短") ], [ (name) => name[0] === "陈", () => console.log("小陈") ], [ (name) => name === "大鹏", () => console.log("管理员") ], [ (name) => name[0] === "李" && name !== "李鹏", () => console.log("小李"), ], ]; // 获取符合条件的子数组 const getDescribe = describeForNameMap.find((item) => item[0](name)); // 子数组存在则运行子数组中的第二个元素(执行函数) getDescribe ? getDescribe[1]() : console.log("此人比较神秘!"); }
上記では、describeForNameMap
配列を定義しました。配列内の各要素は、一連の判定条件と実行関数 (これも配列) を表します。その後、配列の find
メソッドを使用します。 describeForNameMap
配列内で判定条件を満たす部分配列を見つけます。
3️⃣ ブランチの切り離し
上の例で定義した describeForNameMap
オブジェクトは独立した構造であり、完全に切り離すことができます。
const describeForNameMap = { 小刘: () => console.log("刘哥哥"), 小红: () => console.log("小红妹妹"), 陈龙: () => console.log("大师"), 李龙: () => console.log("师傅"), 大鹏: () => console.log("恶人"), }; function getUserDescribe(name) { describeForNameMap[name] ? describeForNameMap[name]() : console.log("此人比较神秘!"); }
const describeForNameMap = [ [ (name) => name.length > 3, // 判断条件 () => console.log("名字太长") // 执行函数 ], [ (name) => name.length < 2, () => console.log("名字太短") ], [ (name) => name[0] === "陈", () => console.log("小陈") ], [ (name) => name === "大鹏", () => console.log("管理员") ], [ (name) => name[0] === "李" && name !== "李鹏", () => console.log("小李"), ], ]; function getUserDescribe(name) { // 获取符合条件的子数组 const getDescribe = describeForNameMap.find((item) => item[0](name)); // 子数组存在则运行子数组中的第二个元素(执行函数) getDescribe ? getDescribe[1]() : console.log("此人比较神秘!"); }
モジュール開発を通じて、この
map
オブジェクトを別のjs
ファイルに記述し、それを使用する必要がある場所にインポートすることもできます。それでおしまい。
4️⃣ 論争
このようにして、getUserDescribe
関数全体が非常に簡潔になります。これに何の意味があるのかと尋ねる学生もいるかもしれません。 ?何を使うか?こっちの方が面倒じゃないですか? if else
が本当に適切ではない場合は、else
の代わりに if return
を使用します。
function getUserDescribe(name) { if (name === "小刘") { console.log("刘哥哥"); return; } if (name === "小红") { console.log("小红妹妹"); return; } if (name === "陈龙") { console.log("大师"); return; } if (name === "李龙") { console.log("师傅"); return; } if (name === "大鹏") { console.log("恶人"); return; } console.log("此人比较神秘!"); }
想像してみてください。 getUserDescribe
関数には1000の判定分岐があり、判定結果に基づいて実行される処理コードも多数あり、getUserDescribe
関数はこの値を返します。処理された判定結果。
このとき、getUserDescribe
関数の focus は、どの分岐で結果が得られるかではなく、 判定結果の処理にあります。例:
function getUserDescribe(name) { let str; // 存储判断结果 if (name.length > 3) { str = "名字太长"; } else if (name.length < 2) { str = "名字太短"; } else if (name[0] === "陈") { str = "小陈"; } else if (name[0] === "李" && name !== "李鹏") { str = "小李"; } else if (name === "李鹏") { str = "管理员"; } else { str = "此人比较神秘!"; } // 对判断结果str的一些处理 // ...... console.log(str); return str; }
getUserDescribe 関数は多数の
if ブランチによって占有され、
getUserDescribe Lost の関数に焦点を当てます (
getUserDescribeFunction
焦点は判定結果の処理です。 結果がどのブランチを通じて得られるかではありません)。最適化されたコード:
const describeForNameMap = [ [(name) => name.length > 3, () => "名字太长"], [(name) => name.length < 2, () => "名字太短"], [(name) => name[0] === "陈", () => "小陈"], [(name) => name === "大鹏", () => "管理员"], [(name) => name[0] === "李" && name !== "李鹏", () => "小李"], ]; function getUserDescribe(name) { let str; // 存储判断结果 const getDescribe = describeForNameMap.find((item) => item[0](name)); if (getDescribe) { str = getDescribe[1](); } else { str = "此人比较神秘!"; } // 对判断结果str的一些处理 // ...... console.log(str); return str; }
getUserDescribe 関数を見ると、
describeForNameMap から値を取得し、それを
str## に割り当てていることがわかります。 # (describeForNameMap
が値をどのように返すかは気にしません) で、str
に対して何らかの処理を行いました。これは、getUserDescribe
関数 (判定結果 str
の処理) の焦点を強調表示します。
describeForNameMapサブ配列の 2 番目の要素で値を直接使用できます:
[(name) => name.length > 3 , "Nameは長すぎます"]
ただし、コード全体のスケーラビリティを考慮すると、関数を使用することをお勧めします。関数はパラメーターを受け取ることができるため、将来的により複雑なシナリオに対処しやすくなります。
? 結論
ブランチの最適化さまざまな言語でさまざまな実装方法とアプリケーション シナリオが存在します。この記事では JavaScript
を使用します。コード ブランチの最適化に関する 2 つのアイデアを紹介します。コードの実装は非常にシンプルで、このアイデアの適用に重点が置かれています。
実は、ブランチの最適化の問題については議論があり、現在 2 つのビューがあります:
-
ビュー 1: わざわざ行う必要はありません最適化と最適化 次のコードは追加の
オブジェクト/配列
を作成するため、オブジェクト/配列
を取得することは、単純にif else
を実行するよりもさらに無駄です。 -
視点 2: ブランチ最適化後のコード
可読性/保守性
は向上しており、object/array
の導入によりパフォーマンスの問題が発生します。この時代では言及する価値はありません。 #########あなたの意見は何ですか?
プログラミング教育
をご覧ください。 !以上がある記事では、分岐最適化の場合に JavaScript を実装する方法を説明しています。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript は Web 開発で広く使用されているプログラミング言語であり、WebSocket はリアルタイム通信に使用されるネットワーク プロトコルです。 2 つの強力な機能を組み合わせることで、効率的なリアルタイム画像処理システムを構築できます。この記事では、JavaScript と WebSocket を使用してこのシステムを実装する方法と、具体的なコード例を紹介します。まず、リアルタイム画像処理システムの要件と目標を明確にする必要があります。リアルタイムの画像データを収集できるカメラ デバイスがあるとします。
