JS数组map替换对象字符串 相似代码效果差异原因排查
问题原因
你的判断完全正确。三元表达式是命中第一个符合条件的分支就直接返回结果,不会再执行后续分支判断。
你第二段代码里,PD-1000B这类sku首先就会命中最靠前的e.sku.startsWith("PD-")条件,直接执行这个分支下的replace("S/A", "").trim()逻辑,后面写的startsWith('PD-1000')、startsWith('PD-1007')等判断根本没有执行机会,自然不会生效。
第一段代码能正常运行,是因为你把通用前缀处理和特殊PD编号格式处理拆成了两次遍历,不存在分支优先级冲突的问题。
单次遍历实现方案
不需要额外写forEach做二次遍历,只要调整三元表达式的判断顺序:把匹配粒度更细、更特殊的规则放在最前面,通用短前缀的兜底规则放在最后,一次map就能完成所有替换:
const what3 = arr1.map((e) => { if (typeof e.sku !== 'string') { return { sku: e.sku, price: typeof e.price === 'undefined' ? '0' : e.price } } return { sku: // 优先匹配特殊PD编号规则 e.sku.startsWith('PD-1000') ? e.sku.replace('PD-1000','PD-1000-').replace("S/A", "").trim() : e.sku.startsWith('PD-1007') ? e.sku.replace('PD-1007','PD-1007-').replace("S/A", "").trim() : e.sku.startsWith('PD-1042') ? e.sku.replace('PD-1042','PD-1042-').replace("S/A", "").trim() : // 通用前缀规则兜底匹配 e.sku.startsWith("PD-") ? e.sku.replace("S/A", "").trim() : e.sku.startsWith('KL') ? e.sku.replace('.', '').trim() : e.sku.startsWith('BD') ? e.sku.replace('-50', '').trim() : e.sku, price: typeof e.price === "undefined" ? "0" : e.price, }; });
注意点
- 写多分支条件判断时,永远遵循「特殊规则在前,通用规则在后」的顺序,就不会出现同前缀下分支被提前拦截的问题
- 上述实现里给特殊PD分支也加上了通用的
replace("S/A", "").trim()处理,避免这类特殊sku带S/A字符时处理遗漏
内容的提问来源于stack exchange,提问作者vazcooo1
相关产品推荐
相关产品推荐

