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 相关文章推荐
js loading加载效果实现代码
Nov 24 Javascript
JavaScript 入门基础知识 想学习js的朋友可以参考下
Dec 26 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
Jul 08 Javascript
JS嵌套函数调用上下文的问题解决
Mar 26 Javascript
jQuery tip提示插件(实例分享)
Apr 28 jQuery
vue2组件之select2调用的示例代码
Oct 12 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
Feb 01 Javascript
webpack项目调试以及独立打包配置文件的方法
Feb 28 Javascript
vue路由懒加载的实现方法
Mar 12 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
Sep 28 Javascript
Js图片点击切换轮播实现代码
Jul 27 Javascript
js实现简易计算器小功能
Nov 18 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
短波的认识
2021/03/01 无线电
浅析51个PHP处理字符串的函数
2013/08/02 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
HR vs CL BO3 第二场 2.13
2021/03/10 DOTA
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
js showModalDialog弹出窗口实例详解
2014/01/07 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
JavaScript实现计数器基础方法
2017/10/10 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
vue 组件简介
2020/07/31 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
python实现线程池的方法
2015/06/30 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
Python高级用法总结
2018/05/26 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
python之super的使用小结
2018/08/13 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
C语言开发工程师测试题
2016/12/20 面试题
目标责任书格式范文
2015/05/11 职场文书
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers