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官方 jQuery1.1.3发布,速度提升800%,体积保持20K
Aug 19 Javascript
基于jquery的让textarea自适应高度的插件
Aug 03 Javascript
Jquery ThickBox插件使用心得(不建议使用)
Sep 08 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
Jan 31 Javascript
AngularJS 入门教程之HTML DOM实例详解
Jul 28 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
Oct 26 Javascript
JavaScript创建对象的七种方式(推荐)
Jun 26 Javascript
Bootstrap table使用方法汇总
Nov 17 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
Jul 07 Javascript
vue移动端弹框组件的实例
Sep 25 Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
Oct 29 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 COOKIE设置为浏览器进程
2009/06/21 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
2016/01/06 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
小程序实现留言板
2018/11/02 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
瑞典多品牌连锁店:Johnells
2021/01/13 全球购物
请说出几个常用的异常类
2013/01/08 面试题
后勤人员岗位职责
2013/12/17 职场文书
影视动画专业个人的自我评价
2013/12/31 职场文书
写给女生的道歉信
2014/01/08 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
团干部培训方案
2014/06/03 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
python文件目录操作之os模块
2021/05/08 Python
Android自定义双向滑动控件
2022/04/19 Java/Android
Python实现双向链表
2022/05/25 Python