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 相关文章推荐
Mootools 1.2教程 Tooltips
Sep 15 Javascript
Javascript 读书笔记索引贴
Jan 11 Javascript
清空上传控件input file的值
Jul 03 Javascript
Vue.js实现拖放效果的实例
Sep 30 Javascript
微信小程序 PHP后端form表单提交实例详解
Jan 12 Javascript
Angular中点击li标签实现更改颜色的核心代码
Dec 08 Javascript
在小程序中使用Echart图表的示例代码
Aug 02 Javascript
使用JS获取页面上的所有标签
Oct 18 Javascript
vue项目每30秒刷新1次接口的实现方法
Dec 04 Javascript
vue进入页面时滚动条始终在底部代码实例
Mar 26 Javascript
angular使用md5,CryptoJS des加密的方法
Jun 03 Javascript
Vue学习之常用指令实例详解
Jan 06 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版(2)
2006/10/09 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
JavaScript 加号(+)运算符号
2009/12/06 Javascript
基于jquery的3d效果实现代码
2011/03/23 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
python实现dict版图遍历示例
2014/02/19 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
在python image 中实现安装中文字体
2020/05/16 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
小学新学期寄语
2014/04/02 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
颐和园的导游词
2015/01/30 职场文书
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
python数字图像处理之图像的批量处理
2022/06/28 Python