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代码应该放在HTML代码哪个位置比较好?
Oct 16 Javascript
JS实现仿京东淘宝竖排二级导航
Dec 08 Javascript
Javascript基础教程之数组 array
Jan 18 Javascript
JQuery datepicker 用法详解
Dec 25 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
Dec 23 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
Mar 04 Javascript
js图片轮播插件的封装
Jul 21 Javascript
vue轮播图插件vue-concise-slider的使用
Mar 13 Javascript
Angular4 反向代理Details实践
May 30 Javascript
JavaScript判断浏览器运行环境的详细方法
Jun 30 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
Mar 25 Javascript
开发一个封装iframe的vue组件
Mar 29 Vue.js
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中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
PHP错误处理函数
2016/04/03 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
vue项目中全局引入1个.scss文件的问题解决
2019/08/01 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
python实现人像动漫化的示例代码
2020/05/17 Python
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
酒店保安员岗位职责
2014/01/31 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
小班评语大全
2014/05/04 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
我的收音机情缘
2022/04/05 无线电