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 ul标签下拉菜单演示代码
Dec 11 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
Dec 05 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
Oct 24 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
Oct 10 Javascript
原生JS获取元素集合的子元素宽度实例
Dec 14 Javascript
angularjs点击图片放大实现上传图片预览
Feb 24 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
Aug 28 jQuery
vue2.0 实现导航守卫的具体用法(路由守卫)
May 17 Javascript
layui实现二维码弹窗、并下载到本地的方法
Sep 25 Javascript
微信小程序实现同时上传多张图片
Feb 03 Javascript
微信小程序实现手指拖动选项排序
Apr 22 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
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
2016/08/21 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
js单词形式的运算符
2014/05/06 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
Three.JS实现三维场景
2018/12/30 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
详解Python中is和==的区别
2019/03/21 Python
python入门教程之基本算术运算符
2020/11/13 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
生产主管岗位职责
2013/11/10 职场文书
应届毕业生自荐信
2014/05/28 职场文书
党员教师一句话承诺
2014/05/30 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
四风自我剖析材料
2014/09/30 职场文书
入股合作协议书
2014/10/12 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android