查找数组是否包含指定元素的最高效实现方案(兼容IE11)
最优兼容方案
在需要兼容IE11的前提下,arr.some(el => el === element)是你列出的方案里的最优选择:
some方法匹配到第一个符合条件的元素就会立即终止遍历,不需要走完整个数组,时间开销更低- 相比
filter方案:filter会强制遍历全量数组生成新的数组实例,再取第一个元素判断,不管是否提前找到匹配项,都会执行全量遍历,内存和时间开销都远高于some方案 - 注意:IE11不支持ES6箭头函数语法,实际兼容写法要改成普通函数:
function arrayContains(arr, target) { return arr.some(function(el) { return el === target; }); }
如果没有IE11兼容要求,优先使用arr.includes(element),语义化最好,性能和some基本持平,原生还支持NaN的匹配判断。
二分查找的适用场景
二分查找的时间复杂度为O(logn),确实比上述O(n)复杂度的遍历方案效率高,但有严格的前提:数组必须是有序的
- 如果你使用的数组本身就是固定排序的,不需要额外排序成本,数据量越大,二分查找的性能优势越明显,这种场景可以优先用二分查找
- 如果数组是无序的,需要先排序再做二分查找,排序本身的时间复杂度为O(nlogn),远高于直接遍历一次的O(n),这种场景用二分查找反而会大幅降低性能,完全没有必要
现有方案的效率水平
对于普通无序数组的查找场景,some和includes的效率已经接近理论最优水平:无序数组判断元素是否存在,理论上最低需要O(n)的遍历成本,这两个都是JS引擎深度优化过的原生方法,性能比手写普通for循环还要好,完全满足绝大多数场景的需求。
额外优化建议
如果需要兼容NaN的匹配(原生===判断NaN会返回false,和includes默认行为不一致),可以调整判断逻辑:
function arrayContains(arr, target) { if (Number.isNaN(target)) { return arr.some(function(el) { return Number.isNaN(el); }); } return arr.some(function(el) { return el === target; }); }
内容的提问来源于stack exchange,提问作者makif
相关产品推荐
相关产品推荐

