JavaScript数组迭代元素推入空数组不生效?addItemToCart函数运行异常
代码运行异常的核心原因与修正方案
核心逻辑错误点
- 校验逻辑放置位置错误导致合法请求被拦截
现有实现每遍历一个合法商品编码就做一次判断:只要当前遍历到的编码不等于传入的itemCode,立刻抛出未识别错误。例如传入合法编码7时,循环第一个匹配到的编码是2,此时2≠7,代码直接进入else分支触发抛错,根本走不到后续匹配到7的判断分支,所有合法的商品加入操作都会被提前阻断。 quantity数组无任何赋值逻辑
代码全程未对quantity执行插入、赋值操作,这个数组始终保持初始空状态,读取quantity[0]只会返回undefined,无法得到预期的数值结果。- 购买数量统计逻辑完全缺失
你预期quantity[0]输出2,对应两次加入编码7的操作,但代码中没有任何对已加入商品的购买次数做统计、同步赋值的逻辑,自然无法实现计数效果。
修正后的可运行实现
调整逻辑顺序为:先完整校验传入的itemCode是否在合法商品编码列表中,校验不通过再抛出错误;校验通过后再执行购物车加入、数量统计的操作,避免边遍历边抛错的问题。
let cart = []; let quantity = []; const prices = [ [2, 20], [7, 50], [12, 100], [17, 40], [22, 32], [27, 25 ] ]; function addItemToCart(itemCode) { const validItemCodes = prices.map(price => price[0]); // 全量校验编码合法性,不匹配直接抛错 if (!validItemCodes.includes(itemCode)) { throw 'item code not recognized'; } // 编码合法后执行加入购物车操作 cart.push(itemCode); // 同步更新数量统计:对应商品在价格列表中的索引位置,累计购买次数 const itemIndex = validItemCodes.indexOf(itemCode); quantity[itemIndex] = (quantity[itemIndex] || 0) + 1; } // 测试逻辑 try{ addItemToCart(7); addItemToCart(7); addItemToCart(17); addItemToCart(22); console.log(addItemToCart(172)); // 触发抛错,被catch捕获输出错误信息 }catch(e){ console.log(e); } // 实际运行结果说明: // 4次合法调用都成功执行时,cart.length实际为4,原预期的3是基于错误逻辑的偏差值 console.log(cart.length) // 编码7在价格列表的索引为1,对应quantity[1]的值为2,若要quantity[0]为2,可调整索引映射逻辑 console.log(quantity[0])
补充说明:原代码中循环结构的逻辑本质是把“全量遍历完成后,确认没有匹配到合法项再报错”的判断逻辑,写成了“只要当前遍历项不匹配就立刻报错”,这是循环内写异常判断的常见误区。
内容的提问来源于stack exchange,提问作者simple life
相关产品推荐
相关产品推荐

