如何通过类访问数组指定索引?实现服务员订单价格求和
问题分析与解决方案
首先明确:你完全不需要用二维数组,当前的问题核心是你往服务员的订单里存的是食物名称字符串,而不是包含价格的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
相关产品推荐
相关产品推荐

