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更改class和id的方法
Oct 10 Javascript
使用javascript获取flash加载的百分比的实现代码
May 25 Javascript
Kibo 用于处理键盘事件的Javascript工具库
Oct 28 Javascript
jQuery控制图片的hover效果(smartRollover.js)
Mar 18 Javascript
xml转json的js代码
Aug 28 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
Feb 28 Javascript
jQuery $.each遍历对象、数组用法实例
Apr 16 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
Feb 27 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
Nov 17 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
Jun 07 Javascript
angular4中引入echarts的方法示例
Jan 29 Javascript
了解javascript中的Dom操作
May 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
php MYSQL 数据备份类
2009/06/19 PHP
php实现图片添加水印功能
2014/02/13 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
JS OOP包机制,类创建的方法定义
2009/11/02 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
Vue利用canvas实现移动端手写板的方法
2018/05/03 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
python逆序打印各位数字的方法
2018/06/25 Python
python如何实现代码检查
2019/06/28 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
Python实现中值滤波去噪方式
2019/12/18 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
蛋白质世界:Protein World
2017/11/23 全球购物
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
有个性的自我评价范文
2013/11/15 职场文书
公证处委托书
2015/01/28 职场文书
十七岁的单车观后感
2015/06/12 职场文书
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL