JavaScript | 可変長引数(rest パラメータ)

JavaScript
スポンサーリンク

では、さらに進化させて 商品ごとに個別の税率や割引率を設定できる本格カート計算関数 を作ります。


例題:商品ごとの税率・割引率対応カート関数

// 商品オブジェクトに price, taxRate, discountRate を設定できる関数
function calculateCart(userName, ...items) {
  console.log("購入者:", userName);

  let subtotal = 0;   // 商品合計
  let totalDiscount = 0; // 割引合計
  let totalTax = 0;      // 消費税合計

  items.forEach(item => {
    // デフォルト値を設定
    const price = item.price || 0;
    const taxRate = item.taxRate ?? 0.1;        // 税率10%をデフォルト
    const discountRate = item.discountRate ?? 0; // 割引率0%をデフォルト

    const discount = Math.floor(price * discountRate);
    const priceAfterDiscount = price - discount;
    const tax = Math.floor(priceAfterDiscount * taxRate);

    console.log(`商品: ${item.name}, 価格: ${price}円, 割引: ${discount}円, 税: ${tax}円`);

    subtotal += price;
    totalDiscount += discount;
    totalTax += tax;
  });

  const total = subtotal - totalDiscount + totalTax;

  console.log("小計:", subtotal, "円");
  console.log("割引合計:", totalDiscount, "円");
  console.log("消費税合計:", totalTax, "円");
  console.log("合計金額:", total, "円");

  return total;
}

// 使用例
calculateCart(
  "太郎",
  { name: "りんご", price: 120, taxRate: 0.08, discountRate: 0.1 }, // 10%割引、8%税
  { name: "バナナ", price: 80 }, // デフォルト割引0%、税10%
  { name: "オレンジ", price: 150, discountRate: 0.2 } // 20%割引、デフォルト税10%
);

/* 出力例:
購入者: 太郎
商品: りんご, 価格: 120円, 割引: 12円, 税: 8円
商品: バナナ, 価格: 80円, 割引: 0円, 税: 8円
商品: オレンジ, 価格: 150円, 割引: 30円, 税: 12円
小計: 350 円
割引合計: 42 円
消費税合計: 28 円
合計金額: 336 円
*/
JavaScript

解説

  1. 商品オブジェクトの拡張
    • price:商品価格
    • taxRate:商品ごとの税率(未指定時は10%)
    • discountRate:商品ごとの割引率(未指定時は0%)
  2. 個別計算
    • 各商品の割引と税額を計算
    • 割引後の価格に税をかける
    • Math.floor で小数点以下切り捨て(実務向け)
  3. 合計計算
    • 小計、割引合計、税合計を集計
    • 最後に合計金額を計算して返す
  4. 柔軟性
    • 商品ごとに異なる税率・割引率に対応可能
    • 引数の数も可変なので、複数商品も簡単に扱える
    • 実務のオンラインショップやPOSシステムに近い仕様

💡 ポイント

  • restパラメータとオブジェクトを組み合わせることで、複雑な可変長データ処理も簡単に実装可能
  • デフォルト値と nullish coalescing (??) を活用すると、未指定の値に対しても安全に計算できる
  • 実務レベルの集計・税計算ロジックをシンプルに書ける
タイトルとURLをコピーしました