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

如何用React+TypeScript简化含大量If语句的价格计算函数?

优化方案:消除大量If语句的价格计算函数

核心思路是通过特征-价格映射表统一管理各特征费用,结合对象遍历替代重复的条件判断,同时修正原逻辑中的状态更新问题,让代码更简洁易维护。

步骤1:提取常量,统一配置

把重复的初始状态和特征价格抽成常量,避免冗余定义,后续修改只需调整一处:

// 初始特征状态常量
const INITIAL_CUSTOMIZATION: HairFeatures = {
  hairstyle: '0',
  haircolor: '0',
  secondaryhaircolor: '0',
  hairtatoo: '0',
  facialhair: '0',
  facialhaircolor: '0',
  eyebrows: '0',
  eyebrowscolor: '0',
};

// 特征-价格映射表,集中管理各特征的费用
const FEATURE_PRICES: Record<keyof HairFeatures, number> = {
  hairstyle: 50,
  hairtatoo: 20,
  haircolor: 120,
  secondaryhaircolor: 80,
  facialhair: 75,
  facialhaircolor: 100,
  eyebrows: 50,
  eyebrowscolor: 50,
};

步骤2:用Reduce遍历替代If语句

借助Object.entries和reduce方法遍历价格配置,对比当前与历史特征值,自动累加差异项的费用,彻底消除大量if判断:

const [previousCustomization, setPreviousCustomization] = useState<HairFeatures>(INITIAL_CUSTOMIZATION);
const [customization, setCustomization] = useState<HairFeatures>(INITIAL_CUSTOMIZATION);
const [price, setPrice] = useState(0);

// 优化后的价格计算函数,无冗余If语句
const calculatePrice = (currentFeatures: HairFeatures, previousFeatures: HairFeatures) => {
  const totalCost = Object.entries(FEATURE_PRICES).reduce((sum, [feature, cost]) => {
    const featureKey = feature as keyof HairFeatures;
    return currentFeatures[featureKey] !== previousFeatures[featureKey] ? sum + cost : sum;
  }, 0);
  
  setPrice(totalCost);
};

步骤3:修正状态更新逻辑

确保每次计算后更新历史特征状态,同时处理React状态更新的异步特性:

const handleBuyButtonClick = () => {
  calculatePrice(customization, previousCustomization);
  // 更新历史特征状态,让下次对比基于上一次的选择
  setPreviousCustomization(customization);
  
  // 注意:setPrice是异步操作,直接console.log拿不到最新值,建议用useEffect监听
};

// 可选:监听价格变化,打印最新值
useEffect(() => {
  console.log('当前总价格:', price);
}, [price]);

进阶逻辑:支持改回特征扣除费用

如果需要基于上一次价格动态调整(而非每次重新计算与初始状态的差异),比如改回历史特征时扣除对应费用,可以调整为增量更新逻辑:

const calculatePrice = (currentFeatures: HairFeatures, previousFeatures: HairFeatures) => {
  setPrice(prevPrice => {
    let newPrice = prevPrice;
    
    for (const [feature, cost] of Object.entries(FEATURE_PRICES) as [keyof HairFeatures, number][]) {
      const currentVal = currentFeatures[feature];
      const prevVal = previousFeatures[feature];
      
      if (currentVal !== prevVal) {
        // 改回初始状态:扣除费用
        if (currentVal === INITIAL_CUSTOMIZATION[feature]) {
          newPrice -= cost;
        } 
        // 从初始状态改为自定义:添加费用
        else if (prevVal === INITIAL_CUSTOMIZATION[feature]) {
          newPrice += cost;
        }
        // 从一个自定义特征改为另一个:先扣原费用再加新费用(按需调整)
        else {
          newPrice = newPrice - cost + cost; // 若不同特征费用不同,需单独配置原费用
        }
      }
    }
    
    // 确保价格不会为负数
    return Math.max(newPrice, 0);
  });
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:40:31