ES5 ES6中Array对象去除重复项的方法总结


Posted in Javascript onApril 27, 2017

输入例子

[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN].uniq()

输出例子

[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']

分析

题目要求给 Array 添加方法,所以我们需要用到 prototype。数组去重本身算法不是很难,但是在 JavaScript 中很多人会忽视 NaN 的存在,因为在 JS 中 NaN !== NaN 。但是在去重中我们又不能保留两个 NaN ,所以需要进行一下判断,这是很多人容易忽视的。

ES5的实现如下:

代码

Array.prototype.uniq = function () {
 var arr = [];
 var flag = true;
 this.forEach(function(item) {
 // 排除 NaN (重要!!!)
 if (item != item) {
 flag && arr.indexOf(item) === -1 ? arr.push(item) : '';
 flag = false;
 } else {
 arr.indexOf(item) === -1 ? arr.push(item) : ''
 }
 });
 return arr;
}

验证

我们只需要在数组上直接调用 uniq 方法就可以了,如:

[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN].uniq()

结果为:

[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']

进阶

ES6的实现

ES6新增了 Set 对象,也就是我们所说的“集合”,它类似于数组,但是成员的值都是唯一的,没有重复的值。所以可以方便去重。

Set本身是一个构造函数,用来生成Set数据结构。(详看?Set和Map数据结构)

如果用ES6为 Array 对象添加一个去除重复项的方法,则可以如下实现:

Array.prototype.uniq = function() {
 return Array.from(new Set(this));
}

代码中用 Array.from 把 Set 结构转换成数组,当然,你也可以用其他方法,这里不深究。这里去重关键代码只需要一行,是不是非常简单??

如果你要优雅一点,可以使用 ES6 的扩展运算符。如下:

Array.prototype.uniq = function() {
 return [...new Set(this)];
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery命令汇总,方便使用jquery的朋友
Jun 26 Javascript
HTML Color Picker(js拾色器效果)
Aug 27 Javascript
ExtJS如何设置与获取radio控件的选取状态
Jan 22 Javascript
js实现双击图片放大单击缩小的方法
Feb 17 Javascript
jquery选择器简述
Aug 31 Javascript
jquery实现经典的淡入淡出选项卡效果代码
Sep 22 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 Javascript
vue  自定义组件实现通讯录功能
Sep 30 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
element-ui表格合并span-method的实现方法
May 21 Javascript
解决vue组件props传值对象获取不到的问题
Jun 06 Javascript
深入了解JavaScript 防抖和节流
Sep 12 Javascript
JavaScript实现隐藏省略文字效果的方法
Apr 27 #Javascript
Vue自定义图片懒加载指令v-lazyload详解
Dec 31 #Javascript
JavaScript实现反转字符串的方法详解
Apr 27 #Javascript
jquery 禁止鼠标右键并监听右键事件
Apr 27 #jQuery
jQuery EasyUI tree增加搜索功能的实现方法
Apr 27 #jQuery
js实现添加删除表格(两种方法)
Apr 27 #Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
Apr 27 #jQuery
You might like
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
javascript 动态加载 css 方法总结
2009/07/11 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
python多进程操作实例
2014/11/21 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
python发送邮件实例分享
2017/07/28 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
谈谈Python中的while循环语句
2019/03/10 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
python线程里哪种模块比较适合
2020/08/02 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
鼋头渚导游词
2015/02/05 职场文书
环境卫生整治简报
2015/07/20 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书
python基础之错误和异常处理
2021/10/24 Python
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle