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 相关文章推荐
javascript 跨浏览器开发经验总结(五) js 事件
May 19 Javascript
点击显示指定元素隐藏其他同辈元素的方法
Feb 19 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
Mar 02 Javascript
Bootstrap每天必学之标签页(Tab)插件
Aug 09 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
Jun 29 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
Aug 28 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
Sep 30 Javascript
Vue.js实现表格渲染的方法
Sep 07 Javascript
Angular父子组件通过服务传参的示例方法
Oct 31 Javascript
Vue.js自定义指令学习使用详解
Oct 19 Javascript
vue实现弹幕功能
Oct 25 Javascript
JS实现判断移动端PC端功能
Feb 21 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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
PHP操作XML作为数据库的类
2010/12/19 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
jQuery中:reset选择器用法实例
2015/01/04 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
Javascript实现登录记住用户名和密码功能
2017/03/22 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
python set内置函数的具体使用
2019/07/02 Python
python3字符串操作总结
2019/07/24 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
Python3列表List入门知识附实例
2020/02/09 Python
Django在Model保存前记录日志实例
2020/05/14 Python
UGG英国官方网站:UGG UK
2018/02/08 全球购物
公司出纳岗位职责
2013/12/07 职场文书
捐书寄语赠言
2014/01/18 职场文书
节约用水的口号
2014/06/20 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
学生早退检讨书(范文)
2019/08/19 职场文书
Python实现老照片修复之上色小技巧
2021/10/16 Python