JS数组some/every方法运行不符合预期 代码逻辑问题排查
问题根因
你写的every+some版本逻辑完全搞反了,而且最初的angular.forEach实现其实也没满足「终止其余检查」的要求:
Array.every()的规则是数组里所有元素都满足回调条件,才会返回true,和你要的「只要有一个匹配就返回true」的需求正好反过来。你那段错误代码实际在判断「月付、年付两个类型下,都得至少有一个产品折扣超标」,只要有一个类型没找到超标项就直接返回false,结果自然不对。angular.forEach里写return只能跳出当前这一次内层循环,根本停不掉外层的遍历,哪怕早就找到超标项了,剩下没跑的数组元素还是会全部走完,只是因为你把exceedsDiscount设为true之后不影响最终结果,才碰巧看起来运行正常。
正确写法
直接用两层Array.some()就行,some天生带短路逻辑:只要回调返回一次true,立刻终止所有后续遍历,完全贴合你的需求:
const exceedsDiscount = priceType.some(type => discounts.some(discount => discount[`${type}Discount`] > discount[`${type}MaxDiscount`]) );
执行逻辑:
- 外层遍历月付/年付两种价格类型,只要某一个类型下查到超标折扣,马上停止遍历剩下的价格类型
- 内层遍历当前价格类型下的所有产品折扣,只要找到一个产品折扣超过对应上限,马上停止遍历当前类型下的剩余产品,向外层返回匹配成功的结果
要是不想写嵌套的方法调用,也可以先把所有要校验的折扣对打平成一维数组,再用单个some判断,效果完全一样:
const exceedsDiscount = priceType .flatMap(type => discounts.map(d => ({ currentVal: d[`${type}Discount`], maxVal: d[`${type}MaxDiscount`] }))) .some(({currentVal, maxVal}) => currentVal > maxVal);
拿你给的测试数据跑:产品A年付折扣25>上限20、产品B年付折扣40>上限30,上面两种写法都会正确返回true,而且找到第一个超标项就停,不会做多余计算。
内容的提问来源于stack exchange,提问作者shukla yogesh
相关产品推荐
相关产品推荐

