如何在循环中检测购物车对象数组的size属性并保留所有对象
解决方案
核心修改:按需添加size属性
原循环直接赋值object.size = cart[i].size会导致所有对象都带size键(无size的对象会是size: undefined),要实现仅当原购物车对象存在size属性时才添加该键,可以用两种方式实现:
方式1:条件判断添加
for (let i = 0; i < cart.length; i++) { const item = cart[i]; const object = { product: item.productId, // 原代码写的item._id和购物车数据里的productId不匹配,必须修正 color: item.color, count: item.count // 原代码漏了count属性,后续计算总价需要用到,必须添加 }; // 检测当前购物车项是否存在size属性,存在则加入object if ('size' in item) { object.size = item.size; } products.push(object); }
方式2:解构赋值+展开运算符(更简洁)
for (let i = 0; i < cart.length; i++) { const { productId: product, color, count, size } = cart[i]; const object = { product, color, count }; // 仅当size存在时才添加该属性 if (size !== undefined) { object.size = size; } products.push(object); }
额外必须修正的问题
你的代码还有两处会导致功能异常的问题,同步修正才能正常运行:
- product字段赋值错误:原代码用
cart[i]._id,但你的购物车数据中商品ID字段是productId,必须改成cart[i].productId。 - products数组缺少price和count字段:后续计算
cartTotal需要price * count,但原循环没添加count,也没从数据库获取商品价格。需要在循环内查询商品信息:
// 循环内部添加商品价格查询 const productInfo = await Product.findById(item.productId); if (!productInfo) { return next(new Error(`商品ID ${item.productId}不存在`)); } // 将price加入object const object = { product: item.productId, color: item.color, count: item.count, price: productInfo.price };
修改后,products数组里的对象会根据原购物车项是否有size属性,动态包含或不包含该键,同时保证总价计算逻辑正常。
内容的提问来源于stack exchange,提问作者nafhaf
相关产品推荐
相关产品推荐

