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