JS で美しい条件式を書く方法についての簡単な説明

JS で美しい条件式を書く方法についての簡単な説明

複数の条件文

Array.includes を使用した複数の条件文

例えば

関数 printAnimals(動物) {
  if (動物 === "犬" || 動物 === "猫") {
    console.log(`私には${animal}がいます`);
  }
}

console.log(printAnimals("dog")); // 犬を飼っています

条件が少ない場合はこの書き方で問題なさそうです。今回は動物が2種類しかありませんが、判定する条件が増えたら(動物が増えたら)どうなるでしょうか?判定条件を拡張し続けると、コードの保守が困難になり、ロジックが不明瞭になります。

回避策

Array.includesを使用して条件文を書き換えることができます

関数 printAnimals(動物) {
  const 動物 = ["犬", "猫", "ハムスター", "カメ"];

  動物が含まれる場合
    console.log(`私には${animal}がいます`);
  }
}

console.log(printAnimals("hamster")); // ハムスターを飼っています

ここでは、条件をコードの残りの部分から個別に抽出するために、動物の配列を作成します。ここで、他の動物がいるかどうかを確認したい場合は、新しい配列項目を追加するだけです。

この関数のスコープ外で animals 変数を使用して、コード内の他の場所で再利用することもできます。これは、より明確で理解しやすく、保守しやすいコードを書く方法です。そうじゃない?

複数属性オブジェクト

これは、コードを凝縮して見た目をきれいにするための非常に良い方法です。前の例にさらにいくつかの条件を追加してみましょう。動物が単純な文字列ではなく、いくつかのプロパティを持つオブジェクトである場合はどうなるでしょうか?

したがって、現在の要件は次のとおりです。

  • 動物がいない場合はエラーをスローします
  • 動物の種類を印刷する
  • 動物の名前を印刷する
  • 動物の性別を印刷する
const printAnimalDetails = (動物) => {
  let result; // 最終値を格納する変数を宣言する

  // 条件 1: 動物に値があるかどうかをチェックする
  (動物)の場合{
    // 条件 2: animal に type プロパティがあるかどうかをチェックする
    if (動物の種類) {
      // 条件 3: 動物に名前プロパティがあるかどうかをチェックする
      if (動物名) {
        // 条件 4: 動物に性別プロパティがあるかどうかをチェックする
        if (動物.性別) {
          result = `${animal.name} は ${animal.gender} ${animal.type} です;`;
        } それ以外 {
          result = "動物の性別なし";
        }
      } それ以外 {
        result = "動物の名前がありません";
      }
    } それ以外 {
      result = "動物の種類がありません";
    }
  } それ以外 {
    result = "動物はいません";
  }

  結果を返します。
};

console.log(printAnimalDetails()); // '動物なし'

console.log(printAnimalDetails({ type: "dog", gender: "female" })); // '動物の名前がありません'

console.log(printAnimalDetails({ type: "dog", name: "Lucy" })); // '動物の性別がありません'

コンソール.log(
  printAnimalDetails({ タイプ: "犬", 名前: "ルーシー", 性別: "女性" })
); // 'ルーシーはメスの犬です'

上記のコードは正常に動作しますが、コードが長く、保守が困難です。ツールチップを使用しないと、閉じ括弧がどこにあるかを判断するのに時間を無駄にする可能性があります。コードにさらに複雑なロジックがあったらどうなるか想像してみてください。たくさんの if...else ステートメント!

上記の関数は、三項演算子、&& 条件などを使用してリファクタリングできますが、複数の return ステートメントを使用して、より正確なコードを記述してみましょう。

const printAnimalDetails = ({ タイプ、名前、性別 } = {}) => {
  if (!type) return "動物の種類がありません";
  if (!name) return "動物の名前がありません";
  if (!gender) return "動物の性別なし";

  // このコード行では、3 つのプロパティすべてを備えた動物が存在することが確認されています。

  `${name} は ${gender} ${type} です` を返します。
};

console.log(printAnimalDetails()); // '動物の種類がありません'

console.log(printAnimalDetails({ type: dog })); // '動物の名前がありません'

console.log(printAnimalDetails({ type: dog, gender: female })); // '動物の名前がありません'

console.log(printAnimalDetails({ type: dog, name: "Lucy", gender: "female" })); // 'Lucy はメスの犬です'

リファクタリングされたバージョンには、構造化分解デフォルト パラメータも含まれます。デフォルト パラメータにより、メソッドに引数として undefined を渡した場合でも、分解する値 (この場合は空のオブジェクト {}) が確保されます。

通常、コードはこれら 2 つのメソッドの間に記述されます。

例えば

関数 printVegetablesWithQuantity(野菜, 数量) {
  const 野菜 = ["ジャガイモ", "キャベツ", "カリフラワー", "アスパラガス"];

  // 条件 1: 野菜が存在すること
  (野菜)の場合{
    // 条件 2: リスト内の項目の 1 つである必要があります
    if (vegetables.includes(vegetable)) {
      console.log(`私は${vegetable}が好きです`);

      // 条件 3: 大量であること
      数量 >= 10 の場合
        console.log("大量に購入しました");
      }
    }
  } それ以外 {
    throw new Error("リストに野菜がありません!");
  }
}

printVegetablesWithQuantity(null); // リストに野菜がありません!
printVegetablesWithQuantity("cabbage"); // 私はキャベツが好きです
printVegetablesWithQuantity("キャベツ", 20);
// 'キャベツが好きです`
// 「大量に購入しました」

現在、次のようになっています。

  • 無効な条件をフィルタリングするif/else文
  • 3 レベルのネストされた if ステートメント (条件 1、2、3)
  • 一般的なルールとしては、無効な条件が見つかった場合は早期に返されます。
関数 printVegetablesWithQuantity(野菜, 数量) {
  const 野菜 = ["ジャガイモ", "キャベツ", "カリフラワー", "アスパラガス"];

  // 条件 1: 早期にエラーをスローする
  if (!vegetable) throw new Error("リストに野菜がありません!");

  // 条件 2: リストに含まれている必要がある
  if (vegetables.includes(vegetable)) {
    console.log(`私は${vegetable}が好きです`);

    // 条件 3: 大量であること
    数量 >= 10 の場合
      console.log("大量に購入しました");
    }
  }
}

こうすることで、ネストされたステートメントのレベルが 1 つ減ります。このコーディング スタイルは、特に長い if ステートメントを使用する場合に適しています。条件を反転して早期に戻ることで、ネストされた if をさらに削減できます。

条件 2 の実行方法については以下を参照してください。

関数 printVegetablesWithQuantity(野菜, 数量) {
  const 野菜 = ["ジャガイモ", "キャベツ", "カリフラワー", "アスパラガス"];

  if (!vegetable) throw new Error("リストに野菜がありません!");
  // 条件 1: 早期にエラーをスローする

  if (!vegetables.includes(vegetable)) return;
  // 条件2: 関数から戻ると野菜は
  // リスト

  console.log(`私は${vegetable}が好きです`);

  // 条件 3: 大量であること
  数量 >= 10 の場合
    console.log("大量に購入しました");
  }
}

条件 2 の条件を逆にすると、コードにネストされたステートメントがなくなります。この手法は、条件が多数あり、特定の条件が満たされない場合にそれ以上の処理を停止したい場合に役立ちます。

したがって、常にネストを減らして早期復帰を目指しますが、やり過ぎないようにしてください。

スイッチステートメントを置き換える

果物を色に応じて印刷する次の例を見てみましょう。

関数 printFruits(color) {
  // スイッチケースを使用して色で果物を検索します
  スイッチ(色){
    ケース「赤」:
      ["リンゴ", "イチゴ"] を返します。
    ケース「黄色」:
      ["バナナ", "パイナップル"]を返します。
    ケース「紫」:
      ["ブドウ", "プラム"]を返します。
    デフォルト:
      戻る [];
  }
}

printFruits(null); // []
printFruits("yellow"); // ['バナナ', 'パイナップル']

上記のコードは正しいですが、非常に冗長です。より簡潔な構文を使用しても同じ結果を得ることができます。

// オブジェクトリテラルを使用して色で果物を検索します
定数フルーツカラー = {
  赤: ["リンゴ", "イチゴ"],
  黄色: ["バナナ", "パイナップル"],
  紫: ["ブドウ", "プラム"],
};

関数 printFruits(color) {
  fruitColor[色] || [] を返します。
}

同様に、Map を使用して次のことを実現することもできます。

// マップを使用して色で果物を検索します
const fruitColor = 新しい Map()
  .set("赤", ["リンゴ", "イチゴ"])
  .set("黄色", ["バナナ", "パイナップル"])
  .set("紫", ["ブドウ", "プラム"]);

関数 printFruits(color) {
  fruitColor.get(color) を返します || [];
}

Map は ES5 以降で利用可能なオブジェクト型であり、キーと値の保存を可能にします。

上記の例では、Array.filter を使用して同じ結果を得ることができます。

const フルーツ = [
  { 名前: "リンゴ", 色: "赤" },
  { 名前: "イチゴ", 色: "赤" },
  { 名前: "バナナ"、色: "黄色" },
  { 名前: "パイナップル"、色: "黄色" },
  { 名前: "ブドウ"、色: "紫" },
  { 名前: "プラム"、色: "紫" },
];

関数 printFruits(color) {
  fruit.filter((fruit) => fruit.color === color); を返します。
}

デフォルトパラメータとデストラクチャリング

JavaScript を使用する場合は、常に null/undefined をチェックし、デフォルト値を割り当てる必要があります。そうしないと、コンパイルが中断されます。

関数 printVegetablesWithQuantity(野菜、数量 = 1) {
// 数量に値がない場合、1 を割り当てます

  if (!vegetable) return;
    console.log(`${quantity} 個の ${vegetable} があります!`);
  }
  //結果
}

printVegetablesWithQuantity('cabbage'); // キャベツは 1 個あります。
printVegetablesWithQuantity('potato', 2); // ジャガイモが2個あります!

Vegetable がオブジェクトの場合はどうなるでしょうか? デフォルトのパラメータを割り当てることはできますか?

関数 printVegetableName(野菜) {
  if (野菜 && 野菜名) {
    console.log(野菜名);
  } それ以外 {
    console.log("不明");
  }
}

printVegetableName(undefined); // 不明
printVegetableName({}); // 不明
printVegetableName({ name: "cabbage", quantity: 2 }); // キャベツ

上記の例では、野菜が入手可能な場合はその名前を出力し、不明な場合は出力します。

デフォルトのパラメータと構造化分解を使用することで、条件文 if (vegetable && Vegetable.name){} を回避できます。

// 破壊 - 名前プロパティのみ取得
// デフォルトの空のオブジェクトを割り当てる {}

関数 printVegetableName({ name } = {}) {
  console.log(名前 || "不明");
}

printVegetableName(undefined); // 不明
printVegetableName({}); // 不明
printVegetableName({ name: "cabbage", quantity: 2 }); // キャベツ

必要なのはプロパティ名だけなので、パラメータの構造を {name} を使用するように変更し、vegetable.name を使用する代わりに、コード内で name を変数として使用できます。

また、デフォルト値として空のオブジェクト {} を割り当てました。そうしないと、printVegetableName(undefined) を実行すると、エラーが発生します。undefined には name プロパティがないため、undefined または null のプロパティ name を分解できません。

条件のすべてまたは一部に一致する

これらの配列メソッドを使用すると、コードの行数を減らすことができます。

次のコードでは、すべての果物が赤かどうかを確認します。

const フルーツ = [
  { 名前: "リンゴ", 色: "赤" },
  { 名前: "バナナ"、色: "黄色" },
  { 名前: "ブドウ"、色: "紫" },
];

関数テスト() {
  isAllRed を true にします。

  // 条件: すべての果物は赤でなければならない
  (果物のfとする){
    if (!isAllRed) break;
    isAllRed = f.color == "赤";
  }

  console.log(isAllRed); // 偽
}

上記のコードは長すぎるので、Array.every を使用するとコード行数を減らすことができます。

const フルーツ = [
  { 名前: "リンゴ"、色: "赤" },
  { 名前: "バナナ"、色: "黄色" },
  { 名前: "ブドウ"、色: "紫" },
];

関数テスト() {
  // 条件: 短い道、すべての果物は赤でなければならない
  const isAllRed = fruit.every((f) => f.color == "red");

  console.log(isAllRed); // 偽
}

同様に、果物が赤いかどうかをテストしたい場合は、Array.some を使用できます。

const フルーツ = [
  { 名前: "リンゴ", 色: "赤" },
  { 名前: "バナナ"、色: "黄色" },
  { 名前: "ブドウ"、色: "紫" },
];

関数テスト() {
  // 条件: 果物が赤ければ
  const isAnyRed = fruit.some((f) => f.color == "red");

  console.log(isAnyRed); // 真
}

オプション連鎖とNullishマージの使用

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/%E5%8F%AF%E9%80%89%E9%93%BE

これら 2 つの機能は、JavaScript でより簡潔な条件文を記述するのに非常に役立ちます。執筆時点では、これらは完全にはサポートされておらず、 Babelを使用してトランスパイルする必要がある可能性があります。

オプション チェーニングは、中間ノードが存在するかどうかを明示的に確認する必要なくツリーのような構造を処理でき、Nullish はオプション チェーニングと組み合わせて非常に効果的に機能し、存在しないノードのデフォルト値が存在することを保証します。

例えば:

定数車 = {
  モデル:「フィエスタ」、
  メーカー:
    名前: 「フォード」、
    住所:
      street: "通りの名前",
      番号: "5555",
      州:「米国」、
    },
  },
};

// 車のモデルを取得する
const model = (car && car.model) || "デフォルトモデル";

// 製造元の住所を取得する
定数ストリート =
  (車 &&
    自動車メーカー &&
    車.メーカー.住所 &&
    車.製造元.住所.通り) ||
  「デフォルトのストリート」;

// 存在しないプロパティを要求する
const 電話番号 =
  車 &&
  自動車メーカー &&
  車.メーカー.住所 &&
  車の製造元の電話番号;

console.log(model); // 'フィエスタ'
console.log(street); // 'ある通りの名前'
console.log(電話番号); // 未定義

したがって、自動車メーカーが米国のものかどうかを出力したい場合、コードは次のようになります。

const isManufacturerFromUSA = () => {
  もし (
    車 &&
    自動車メーカー &&
    車.メーカー.住所 &&
    car.manufacturer.address.state === "米国"
  ){
    コンソールにログ出力します。
  }
};

checkCarManufacturerState(); // 'true'

より複雑なオブジェクト構造の場合、これがどれほど面倒になるかがはっきりとわかります。 lodash や idx など、独自の機能を備えたサードパーティ ライブラリがいくつかあります。たとえば、lodash には _.get メソッドがあります。ただし、この機能は JavaScript 言語自体に導入されました。

これらの新機能の仕組みは次のとおりです。

// 車のモデルを取得する
const model = car?.model ?? "デフォルトモデル";

// 製造元の住所を取得する
const street = car?.manufacturer?.address?.street ?? "デフォルトの通り";

// 自動車メーカーが米国製かどうかをチェックする
const isManufacturerFromUSA = () => {
  if (車?.製造元?.住所?.州 === "米国") {
    コンソールにログ出力します。
  }
};

現在ステージ3です。

上記は、JavaScript に基づく条件式の一部を共有したものです。お役に立てれば幸いです。

上記は、JS で美しい条件式を書く方法についての簡単な説明です。JS で美しい条件式を書く方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • JavaScript の条件文の最適化手法の概要
  • JavaScript でより良い条件文を書く方法
  • JSPはクエリ条件を持つ一般的なページングコンポーネントを実装します
  • 良い JS 条件文を書くための 5 つのルールの詳細な説明
  • より良い JavaScript 条件文を書くための 5 つのヒントを紹介します
  • JavaScript における条件文の使用法の詳細な説明
  • JScript の条件付きコメントの詳細な説明
  • Javascript 基本チュートリアル - if 条件文
  • JavaScript での条件判断

<<:  Linux での MySQL 5.7 の導入とリモート アクセス構成

>>:  Dockerコンテナ内の設定ファイルの変更の実装

推薦する

MySql データベースにリモートでログインするにはどうすればよいですか?

はじめに: プロジェクトを開発するために、サーバーに MySql データベース サーバーを展開し、ロ...

MySQL 4 の一般的なマスタースレーブレプリケーションアーキテクチャ

目次1つのマスターと複数のスレーブのレプリケーションアーキテクチャマルチレベルレプリケーションアーキ...

Linux システムで .sh ファイルを実行する方法

Linux システムで .sh ファイルを実行する方法は 2 つあります。たとえば、ルート ディレク...

Facebook によるインターネット サービスのほぼ完璧な再設計

<br />出典: http://www.a-xuan.cn/?p=197 先ほどFac...

JavaScript のマクロタスクとマイクロタスクの詳細

目次1. マイクロタスクとは何ですか? 2. マクロタスクとは何ですか? 3. 事例3.1 結論4....

MySQL Installer 8.0.21 インストール チュートリアル (画像とテキスト付き)

1. 理由新しいシステムに MySQL を再インストールする必要があったので、将来詳細を忘れた場合...

Gogs+Jenkins+Docker による .NetCore ステップの自動デプロイ

目次環境説明DockerのインストールゴグのインストールDocker で .NetCore サービス...

uniapp WeChatミニプログラムのグローバル共有を実装するためのサンプルコード

目次グローバル共有コンテンツファイルを作成するファイルをインポートしてグローバルに登録するページ共有...

nginx 設定ファイルで環境変数を使用する方法

序文Nginx はパフォーマンスを重視して設計された HTTP サーバーです。Apache や li...

HTML/XHTML における img 画像タグの基本的な使用法の詳細な説明

画像タグは、Web ページに画像を表示するために使用されます。 HTML/XHTML 画像 <...

Vue の動的メニュー、動的ルートの読み込みと更新の落とし穴

目次必要:アイデア:レッスン:テキストを共有する:要約する必要:インターフェイスからサブメニュー デ...

JavaScript BOM の説明

目次1. BOMの紹介1. JavaScriptは3つの部分から構成される2.ウィンドウオブジェクト...

JavaScriptプロトタイプチェーン図のまとめと実践

目次プロトタイプチェーンプロトタイプチェーンに基づいてシンプルなJQueryライブラリを実装すること...

DockerはRedisを起動し、パスワードを設定します

RedisはRedisバージョン5のapline(Alps)イメージを使用します。これは小さくて高速...

MySQLクエリが遅い場合の理由と解決策

Python プログラムを書き、Mysql ライブラリを集中的に操作したためです。データ量が多くない...