You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过类访问数组指定索引?实现服务员订单价格求和

问题分析与解决方案

首先明确:你完全不需要用二维数组,当前的问题核心是你往服务员的订单里存的是食物名称字符串,而不是包含价格的Item对象,所以自然无法通过.price获取到价格值。另外总价计算的逻辑也有几处错误,我来一步步帮你修正:

核心问题拆解

  • 你现在执行waiter.order.push(foodItem)时,foodItem是选中的食物名称字符串(比如"Peene Primvera"),而不是mainFood里的Item实例,所以order数组里全是字符串,没有price属性,这就是waiters[0].order.price返回undefined的原因。
  • Waiter构造函数里total参数没有默认值,实例化时没传的话会是undefined,而且你用waiter.total.add(total)是错误的——数字没有add方法,直接赋值即可。
  • 你提前计算了total,此时订单还没添加新菜品,计算的是旧的总价(甚至是0),逻辑顺序不对。

修正步骤与完整代码

1. 修正Waiter构造函数

给total设置默认值0,避免初始为undefined:

class Waiter{
 constructor (name, order = [], total = 0){
  this.name = name;
  this.order = order;
  this.total = total;
 }
}

2. 修正表单提交逻辑

需要根据选中的食物名称,找到对应的Item对象,再添加到订单中,之后重新计算总价:

formEl.onsubmit = function (e){
 e.preventDefault(); // 用这个代替return false,更符合标准写法

 const foodItemName = foodMain.options[foodMain.selectedIndex].value;
 const waiterName = waitersEl.options[waitersEl.selectedIndex].value;
 
 // 找到对应的服务员和菜品对象
 const waiter = waiters.find(({ name }) => name === waiterName);
 const selectedItem = mainFood.find(item => item.item === foodItemName);

 if (waiter && selectedItem) {
  // 往订单里添加Item对象,而不是字符串
  waiter.order.push(selectedItem);
  
  // 重新计算总价:遍历order里的Item,累加price
  waiter.total = waiter.order.reduce((sum, item) => sum + item.price, 0);
  
  console.log(waiters);
  // 现在你可以看到Timo的total会是29.0当添加两次Peene Primvera时
 };
};

3. 验证效果

当你给Timo添加两次Peene Primvera后,打印waiters[0]会得到:

Waiter {
  name: "Timo",
  order: [Item, Item], // 两个Item实例,每个都有item和price属性
  total: 29.0
}

此时你可以正常通过waiters[0].order[0].price获取单份菜品价格,waiters[0].total直接拿到总价。

额外优化建议

  • 如果想在订单里显示带价格的字符串(比如你示例里的"Peene Primvera (14.5)"),可以给Item类加一个toString方法,方便显示:
class Item {
 constructor (item, price) {
  this.item = item;
  this.price = price;
 }
 toString() {
  return `${this.item} (${this.price})`;
 }
}
// 之后显示时可以用waiter.order.map(item => item.toString())

内容的提问来源于stack exchange,提问作者Liam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:57:35