如何缩短含条件的嵌套数组过滤函数并避免代码重复?
精简优化方案
原代码的核心冗余点是重复的过滤逻辑和几乎完全一致的map回调,只需要把差异部分抽离,就能在保留原有功能的前提下大幅精简:
优化后的代码
const getCommonCreditProps = (creditProgram, term) => { // 统一执行过滤,避免重复编写 const filteredIns = creditProgram.insuranceProducts.filter(i => i.code !== 'ins_cp_st_avtomoblst_4'); // 抽离通用的保险项处理逻辑,通过调整值区分加减操作 const processIns = (adjustment) => (ins) => { let rateDiscount = 0; try { rateDiscount = ins.discountFieldName + adjustment; } catch (err) { console.error(err); } return { ...ins, productName: getInsurancesName(ins.type, rateDiscount || 0), discount: rateDiscount || 0, }; }; // 根据term选择对应的调整值,执行map转换 const currentInsurances = filteredIns.map(processIns(term > 47 ? 1 : -1)); return { currentInsurances }; };
关键优化点
- 消除重复过滤:把
filter逻辑提出来只执行一次,避免在三元运算符里重复写相同的过滤代码 - 抽离通用处理函数:用高阶函数
processIns封装map回调的通用逻辑,仅通过adjustment参数(1或-1)处理term > 47带来的差异,彻底避免重复代码 - 减少可变变量:用
const替代let,所有变量只声明一次,代码更稳定易读 - 完全保留原有功能:错误处理、折扣计算规则、返回结构和原代码完全一致,没有任何功能改动
可选进一步精简(如果允许调整错误处理逻辑)
如果可以确定discountFieldName是数字类型或不存在时不会抛出错误,也可以把try-catch换成类型判断,进一步缩短代码:
const processIns = (adjustment) => (ins) => { const rateDiscount = typeof ins.discountFieldName === 'number' ? ins.discountFieldName + adjustment : 0; return { ...ins, productName: getInsurancesName(ins.type, rateDiscount), discount: rateDiscount, }; };
内容的提问来源于stack exchange,提问作者jeje
相关产品推荐
相关产品推荐

