Introduction
搜索数组中的元素是我们在日常开发中经常遇到的问题,本文将介绍 JavaScript 中搜索数组元素的几种方法。
Array.prototype.indexOf()
在ES6之前,我们通常使用indexOf
方法来查找数组中的元素的下标。此函数多用于判断数组中是否存在某元素。Array.prototype.indexOf()
方法返回给定元素的第一个索引,如果不存在,则返回 -1
。indexOf
方法的语法如下:
1 | indexOf(searchElement) |
searchElement
:要查找的元素。fromIndex
:从该索引处开始查找。如果该值大于或等于数组的长度,则indexOf
返回-1
,表示未找到。
1 | const arr = [1, 2, 3, 4, 5]; |
indexOf
的弊端是只能查找有确定值的元素,无法按条件查找,比如查找大于3的元素下标。
Array.prototype.find()
ES6引入了find
方法,相比indexOf
方法,find
方法使用一个条件函数来查找数组中的元素。Array.prototype.find()
方法返回数组中满足条件的第一个元素的值。如果找不到责则返回 undefined
。find
一旦找到元素,立即停止查找并返回。find
方法的语法如下:
1 | find(callbackFn) |
callbackFn
函数接收三个参数:
element
:数组中当前正在处理的元素。index
:数组中当前正在处理的元素的索引。array
:调用find
方法的数组。
以下代码查找数组中等于3的元素。
1 | const arr = [1, 2, 3, 4, 5]; |
以下代码查找数组中大于3的元素。
1 | const arr = [1, 2, 3, 4, 5]; |
由此可见find
相比indexOf
更加灵活:
indexOf
只能查找元素的下标,而find
可以查找元素本身。indexOf
只能查找有确定值的元素下标,而find
可以按条件查找。
如果想按条件查找元素的下标该怎么办呢?这时候就需要用到findIndex
方法。
Array.prototype.findIndex()
Array.prototype.findIndex()
该方法与find
方法类似,只不过它不是返回元素,而是返回元素的下标。找不到则返回 -1
。findIndex
一旦找到一个匹配,立即停止查找并返回。findIndex
方法的语法如下:
1 | findIndex(callbackFn) |
callbackFn
函数接收三个参数:
element
:数组中当前正在处理的元素。index
:数组中当前正在处理的元素的索引。array
:调用findIndex
方法的数组。
1 | const arr = [1, 2, 3, 4, 5]; |
Array.prototype.includes()
Array.prototype.includes()
方法用来判断一个数组是否包含一个指定的值,如果是返回 true
,否则返回 false
。includes
方法的语法如下:
1 | includes(searchElement) |
searchElement
:要查找的元素。fromIndex
:从该索引处开始查找。如果该值大于或等于数组的长度,则includes
返回false
,表示未找到。
1 | const arr = [1, 2, 3, 4, 5]; |
注意:includes
方法只能判断特定值,而不能按条件判断,比如判断数组中是否有大于3的元素,include
做不到。
总结
比较方式:
find
和findIndex
方法是通过回调函数来判断元素是否满足条件。indexOf
使用strict equal===
来判断元素是否相等。includes
方法是通过SameValueZero
算法来判断元素是否相等。
Sparsed Array的处理方式:
indexOf
会跳过稀疏数组中的空位。findIndex
和includes
方法不会
跳过稀疏数组中的空位。
undefined
和NaN
的处理方式:
indexOf
方法无法正确处理undefined
和NaN
。1
2[NaN].indexOf(NaN); // output: -1
Array(1).indexOf(undefined); // output: -1includes
方法可以正确处理undefined
及NaN
。1
2[NaN].includes(NaN); // true
Array(1).includes(undefined); // truefind
/findIndex
方法可以正确处理undefined
及NaN
吗?这取决于回调函数的具体实现。1
2[NaN].find(x => Number.isNaN(x)); // OK
Array(1).findIndex(x => x === undefined); // OK
使用场景
- 如果只需判断某元素是否在数组中,使用
includes
方法。 - 如果需要对找到的元素做进一步处理,那么使用
find
方法。 - 如果需要按确定值查找元素下标,使用
indexOf
方法。 - 如果需要根据条件查找数组中的元素的下标,使用
findIndex
方法。