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 相关文章推荐
Flash+XML滚动新闻代码 无图片 附源码下载
Nov 22 Javascript
js调用css属性写法
Sep 21 Javascript
使用 js+正则表达式为关键词添加链接
Nov 11 Javascript
jQuery弹出框代码封装DialogHelper
Jan 30 Javascript
使用AngularJS处理单选框和复选框的简单方法
Jun 19 Javascript
jQuery控制frames及frame页面JS的方法
Mar 08 Javascript
angular 基于ng-messages的表单验证实例
May 04 Javascript
Javascript实现页面滚动时导航智能定位
May 06 Javascript
JavaScript中AOP的实现与应用
May 06 Javascript
React Hooks 实现和由来以及解决的问题详解
Jan 17 Javascript
JavaScript接口实现方法实例分析
May 16 Javascript
Element InfiniteScroll无限滚动的具体使用方法
Jul 27 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
笑谈配置,使用Smarty技术
2007/01/04 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
php 网上商城促销设计实例代码
2012/02/17 PHP
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
Python设计模式之代理模式实例
2014/04/26 Python
Python字符串详细介绍
2015/05/09 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
python re模块findall()函数实例解析
2018/01/19 Python
Python类中self参数用法详解
2020/02/13 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
Django静态文件加载失败解决方案
2020/08/26 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
判断单链表中是否存在环
2012/07/16 面试题
毕业大学生自荐信
2014/06/17 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
歌剧魅影观后感
2015/06/05 职场文书