では、さらに進化させて 商品ごとに個別の税率や割引率を設定できる本格カート計算関数 を作ります。
例題:商品ごとの税率・割引率対応カート関数
// 商品オブジェクトに 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解説
- 商品オブジェクトの拡張
price:商品価格taxRate:商品ごとの税率(未指定時は10%)discountRate:商品ごとの割引率(未指定時は0%)
- 個別計算
- 各商品の割引と税額を計算
- 割引後の価格に税をかける
- Math.floor で小数点以下切り捨て(実務向け)
- 合計計算
- 小計、割引合計、税合計を集計
- 最後に合計金額を計算して返す
- 柔軟性
- 商品ごとに異なる税率・割引率に対応可能
- 引数の数も可変なので、複数商品も簡単に扱える
- 実務のオンラインショップやPOSシステムに近い仕様
💡 ポイント
- restパラメータとオブジェクトを組み合わせることで、複雑な可変長データ処理も簡単に実装可能
- デフォルト値と nullish coalescing (
??) を活用すると、未指定の値に対しても安全に計算できる - 実務レベルの集計・税計算ロジックをシンプルに書ける


