JS判断数组是否包含某元素实现方法汇总


Posted in Javascript onJune 24, 2020

我在学习ES6数组拓展时,发现了新增了不少了有趣的数组方法,突然想好工作中判断数组是否包含某个元素是非常常见的操作,那么这篇文章顺便做个整理。

1.for循环结合break

可能很多人第一会想到for循环,毕竟for是最为保险和熟悉的操作:

let arr = [1, 2, undefined, '听风是风', 'echo'],
  i = 0;
const LENGTH = arr.length;

//初始化result状态,只要能找到匹配的则修改为true
let result = false;
for (; i < LENGTH; i++) {
  if (arr[i] === '听风是风') {
    result = true;
    break;
  };
};
if (result) {
  //do something...
};

使用for的好处是,能结合break在找到满足条件的情况下,立刻跳出循环,如果第一个元素就符合条件,那后续循环步骤都可以优化直接跳过了。

使用for的缺点是,查找不够直观,我们在for循环中无法直接return查询结果,当然你可以将for循环写在一个函数中,但你还是需要额外定义个result变量。

其次,对于数组操作,我们虽然能使用for循环解决很多问题,但我们不能把目光永远第一个投向for,除了for呢?试着将目光投向更多数组高阶函数,思考更多可能是非常必要的。

说到for你肯定会本能想到forEach,虽然forEach能使用回调函数,但依旧无法在回调函数中使用return,外加上无法直接使用break,这里就不做介绍了。

最后,for循环与forEach对于查找NaN不那么实用,毕竟NaN是唯一一个不等于自己的存在,当然也能实现又能判断NaN还能判断其它非NaN对象,只是比较麻烦了。

2.Arr.indexOf()方法

let arr = [1, 2, undefined, '听风是风', 'echo'];

//利用indexOf查找下标的特性
let result = arr.indexOf('听风是风');//3
if (result>-1) {
  //do something...
};

indexOf方法会从头到尾的检索数组,如果找到了第一个符合条件的元素则返回该元素的下标,如果没找到则返回-1,所以只要能找到最小下标也应该是0,这才有了if(result>-1)的写法。

相对for循环来说,indexOf写法上简洁了不少,但相比for循环能使用break,indexOf即便找到了想要的元素,它还是不会停下检索的脚步,这点就不太优化了。

其次,语义化不太友好,我们是希望判断一个数组有没有某个元素,结果我们到底是拿了下标来做判断,当然,对于NaN查找也不那么友好。

[NaN].indexOf(NaN);//-1

3.find()与findIndex()方法

let arr = [1, 2, undefined, '听风是风', 'echo'];

//利用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,当然也能判断其它对象,是不是非常的奈斯?

[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,这两个方法都比较推荐。

4.some()方法

let arr = [1, 2, undefined, '听风是风', 'echo'];

//利用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));

5.includes()方法

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

希望到这里,在以后查找某数组是否包含某元素时,你又多了几种新的花样。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 闭包
Sep 15 Javascript
jquery在Chrome下获取图片的长宽问题解决
Mar 20 Javascript
jquery $.each() 使用小探
Aug 23 Javascript
js控制input框只读实现示例
Jan 20 Javascript
JavaScript中计算网页中某个元素的位置
Jun 10 Javascript
基于jquery实现表格内容筛选功能实例解析
May 09 Javascript
jQuery文件上传控件 Uploadify 详解
Jun 20 Javascript
超详细的JS弹出窗口代码大全
Apr 18 Javascript
js canvas实现放大镜查看图片功能
Jun 08 Javascript
Koa2 之文件上传下载的示例代码
Mar 29 Javascript
Electron 调用命令行(cmd)
Sep 23 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
Aug 06 Javascript
JS script脚本中async和defer区别详解
Jun 24 #Javascript
javascript实现前端分页效果
Jun 24 #Javascript
JS实现多选框的操作
Jun 24 #Javascript
微信小程序实现发微博功能的示例代码
Jun 24 #Javascript
JavaScript实现答题评分功能页面
Jun 24 #Javascript
JS实现电脑虚拟键盘打字测试
Jun 24 #Javascript
JS实现简单打字测试
Jun 24 #Javascript
You might like
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
php文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
python获取从命令行输入数字的方法
2015/04/29 Python
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
2013年大学生的自我鉴定
2013/10/24 职场文书
审核会计岗位职责
2013/11/08 职场文书
计算机专业毕业生自荐信
2013/12/31 职场文书
快餐店的创业计划书范文
2014/01/29 职场文书
老师对学生的寄语
2014/04/09 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
爱护公物主题班会
2015/08/17 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
Python编写nmap扫描工具
2021/07/21 Python
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL