find()与findIndex()方法 let arr = [1, 2, undefined, '听风是风', 'echo']; //利用indexOf查找下标的特性 let result = arr.find(ele = ele === '听风是风')//听风之风 if (result) { //do something... }; find方法是比较推荐
//利用indexOf查找下标的特性
let result = arr.find(ele => ele === '听风是风')//听风之风
if (result) {
//do something...
};
find方法是比较推荐的做法,find方法会找到第一个符合条件的数组元素,并返回它,如果没找到则返回undefined。
需要注意的是,只要find找到符合条件的对象后不会继续遍历,可以说自带了break操作,加上箭头函数简化回调,整体代码非常直观。
let arr = [1, 2, undefined, '听风是风', 'echo'];//利用indexOf查找下标的特性
let result = arr.findIndex(ele => ele === '听风是风')//3
if (result>-1) {
//do something...
};
findIndex方法与find方法非常类似,只是它返回的不是符合条件的对象,而是该对象的下标,找到后同样会跳出循环,如果没找到则返回-1,这一点与indexOf有点类似。
比较理想的是,find方法还能结合Object.is()方法判断NaN,当然也能判断其它对象,是不是非常的nice?
[NaN].find(ele => Object.is(NaN, ele)); //NaN[1].find(ele => Object.is(1, ele)); //1
[NaN].findIndex(ele => Object.is(NaN, ele)); //0
[1].findIndex(ele => Object.is(1, ele)); //0
写法简洁,自带break,还能判断NaN,这两个方法都比较推荐。
//利用indexOf查找下标的特性
let result = arr.some(ele => ele === '听风是风') //true
if (result) {
//do something...
};
some方法同样用于检测是否有满足条件的元素,如果有,则不继续检索后面的元素,直接返回true,如果都不符合,则返回一个false。
用法与find相似,只是find是返回满足条件的元素,some返回的是一个Boolean值,从语义化来说,是否包含返回布尔值更贴切。
当然,some方法同样能结合Object.is()方法检测NaN。some也是较为推荐的方法
[NaN].some(ele => Object.is(NaN, ele));ES6新增的数组方法,用于检测数组是否包含某个元素,如果包含返回true,否则返回false,比较厉害的是,能直接检测NaN:
[1, 3, 'echo'].includes('echo'); //true[NaN, 3, 'echo'].includes(NaN); //true
[1, 3, 'echo'].includes('听风是风'); //false
优点就不用说了,最简单的做法没有之一,不用回调,不用复杂的写法,一个方法直接搞定。
缺点是低版本浏览器支持不是很友好,当然能用我们还是用,不能用我们就自己封装:
let hasEle = (() =>Array.prototype.includes ?
(arr, val) => arr.includes(val) :
(arr, val) => arr.some(ele => Object.is(val, ele))
)();
hasEle([1, 2, NaN], 1) //true
hasEle([1, 2, NaN], NaN) //true
hasEle([1, 2, NaN], '听风是风') //false