JavaScript | 引数の数に応じて処理を変える関数

JavaScript JavaScript
スポンサーリンク

四則演算をサポートする電卓ユーティリティ

実用的に使える「加算・減算・乗算・除算」を全部サポートした関数です。入力チェックやエラーメッセージも備えています。


コード

function calculator(mode, ...nums) {
  // 型チェック:数値以外を含む場合はエラー
  if (nums.length === 0) return "数値を入力してください";
  if (!nums.every(n => typeof n === "number" && Number.isFinite(n))) {
    return "数値のみを入力してください";
  }

  switch (mode) {
    case "add": {
      return nums.reduce((sum, n) => sum + n, 0);
    }

    case "subtract": {
      // 1つなら符号反転、2つ以上なら左から順に引いていく
      if (nums.length === 1) return -nums[0];
      return nums.slice(1).reduce((acc, n) => acc - n, nums[0]);
    }

    case "multiply": {
      return nums.reduce((product, n) => product * n, 1);
    }

    case "divide": {
      // 1つなら 1 / x、2つ以上なら左から順に割る
      if (nums.length === 1) {
        if (nums[0] === 0) return "0 で割ることはできません";
        return 1 / nums[0];
      }
      // 途中で 0 を含む場合はエラーを返す
      for (let i = 1; i < nums.length; i++) {
        if (nums[i] === 0) return "0 で割ることはできません";
      }
      return nums.slice(1).reduce((acc, n) => acc / n, nums[0]);
    }

    default:
      return "対応していないモードです(add / subtract / multiply / divide を指定してください)";
  }
}
JavaScript

使い方例

console.log(calculator("add", 1, 2, 3, 4));        // 10
console.log(calculator("subtract", 10));           // -10
console.log(calculator("subtract", 10, 3, 2));     // 5  (10 - 3 - 2)
console.log(calculator("multiply", 2, 3, 4));      // 24
console.log(calculator("divide", 20, 2, 2));       // 5  (20 / 2 / 2)
console.log(calculator("divide", 5));              // 0.2 (1 / 5)
console.log(calculator("divide", 10, 0));          // "0 で割ることはできません"
console.log(calculator("add", 1, "2"));            // "数値のみを入力してください"
console.log(calculator("pow", 2, 3));              // "対応していないモードです..."
JavaScript

仕様のポイント

  • モード指定: “add” / “subtract” / “multiply” / “divide” の4種類。
  • 入力チェック: 数値のみを許可、未入力をエラーにする。
  • 減算の仕様:
    • 1引数: 符号反転(例:subtract(10) → -10)
    • 2引数以上: 左から順に引く(例:subtract(10, 3, 2) → 5)
  • 除算の仕様:
    • 1引数: 逆数(例:divide(5) → 0.2)
    • 2引数以上: 左から順に割る。途中に 0 がある場合はエラー。
  • 戻り値: 成功時は数値、入力エラーや未対応モードは文字列メッセージ。

拡張アイデア

  • ラベル付き引数: オプションをオブジェクトで渡し、丸め設定や精度指定を追加する。
  • 結果のフォーマット: 小数点の桁数を固定(例:toFixed)や、丸めルール(銀行丸め)を選べるようにする。
  • 追加モード: “max” / “min” / “average” / “sumOfSquares” を追加して計算ユーティリティに拡張する。

タイトルとURLをコピーしました