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

JavaScript对象数组价格重复相乘问题求助(单价×数量计算异常)

问题分析与解决方法

问题核心:你每次更新购物车商品价格时,误用了已经计算过总价的item.price去乘以count,导致每次操作都在之前的总价基础上重复相乘,自然会出现价格异常增长的情况。

解决关键:必须保留商品的原始单价,每次计算总价都基于「原始单价 × 当前数量」,而非已计算的总价。


具体修改步骤

1. 调整类型定义,新增原始单价字段

首先在ProductType中添加originalPrice字段,专门存储商品的原始单价:

type ProductType = {
  picture: string;
  title: string;
  price: number; // 存储总价:originalPrice × quantity
  originalPrice: number; // 新增:存储商品的原始单价
  productRef: string;
  quantity: number;
};

2. 修改商品创建逻辑,保留原始单价

在handleCart中创建newProduct时,同时保存原始单价和基于它计算的总价:

function handleCart() {
  const newProduct: ProductType = {
    picture: imageSrc,
    title,
    originalPrice: price, // 存入原始单价
    price: price * count, // 总价基于原始单价计算
    productRef,
    quantity: count
  };  
  setCart(prev => handeleCartControl({
    array: prev,
    newProduct,
    statement1: prev.some(item => item.productRef === productRef) && count !== 0,
    statement2: count > 0
  }));
}

3. 修正价格更新逻辑,基于原始单价计算

在handeleCartControl的更新分支中,只针对目标商品,用其原始单价乘以新数量得到正确总价:

function handeleCartControl({
  array,
  newProduct,
  statement1,
  statement2
}: {
  array: ProductType[],
  newProduct: ProductType,
  statement1: boolean,
  statement2: boolean,
}) {
  if (statement1) {
    return array.map(item => {
      // 仅更新匹配到的目标商品
      if (item.productRef === newProduct.productRef) {
        return {
          ...item,
          quantity: newProduct.quantity,
          price: item.originalPrice * newProduct.quantity
        };
      }
      return item;
    });
  } else if (statement2) {
    return [...array, newProduct];
  } else return array.filter(item => item.productRef !== newProduct.productRef);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:36:35