整数数组重复值校验功能使用forEach语法实现失效问题咨询
ES6 风格实现数组重复值判断方案
Array.prototype.forEach 原生不支持提前终止遍历,不适合需要中途退出的判断场景,以下是两种符合ES6规范、语义清晰的实现方式:
方案1:极简实现(基于Set特性)
直接利用ES6 Set 自动去重的特性对比长度,代码最简洁:
const containsDuplicate = nums => new Set(nums).size !== nums.length;
逻辑说明:Set实例会自动过滤传入数组的重复元素,若去重后的元素数量与原数组长度不一致,即可判定存在重复值。该写法适合绝大多数普通业务场景。
方案2:支持提前终止的实现(基于Array.some + Set)
如果需要遇到第一个重复值就立刻终止遍历,减少不必要的遍历开销,可以用Array.some方法,该方法只要匹配到第一个符合条件的元素就会自动中断遍历:
const containsDuplicate = (nums) => { const seen = new Set(); return nums.some(num => { if (seen.has(num)) return true; seen.add(num); return false; }); };
逻辑说明:使用ES6 Set作为存储已遍历元素的集合,相比普通对象的in判断不会存在属性名隐式类型转换的问题,语义更清晰,运行效率更高。
注:不建议使用抛异常的方式强行中断forEach遍历,该写法属于hack实现,会破坏代码可读性,也会带来额外的异常处理开销,完全没有必要使用。
内容的提问来源于stack exchange,提问作者Davi Cheli Miquelim
相关产品推荐
相关产品推荐

