为Array对象添加一个去重的方法(ES5和ES6的实现)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为Array对象添加一个去重的方法(ES5和ES6的实现)相关的知识,希望对你有一定的参考价值。
输入一个例子
[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的情况下我是使用indexOf判断是不是-1 或者是inCludes是不是false,再添加到数组中去。
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;
}
上边的if语句就是为了判断是不是NaN,给NaN一个标识,只要进来一次NaN就把他置为false,之后的话NaN再进入判断就不会再添加进去。这是真的精妙~
之后调用uniq方法,如
[false, true, undefined, null, NaN, 0, 1, {}, {}, ‘a‘, ‘a‘, NaN].uniq()
这里的话自己测试一下吧!
ES6的实现如下:
ES6新增了Set对象,也就是我们所说的“集合”,它类似于数组,但是成员的值都是唯一的,没有重复的值。所以可以方便去重。
Set本身是一个构造函数,用来生成Set数据结构。
Set本身是一个构造函数,用来生成Set数据结构。
Array.prototype.uniq = function() {
return Array.from(new Set(this));
}
代码中Array.from把Set结构换成数组,最最重要的是代码只需要一行就能实现
如果要写的优雅一点的话,可以使用ES6的扩展运算符
Array.prototype.uniq = function() {
return [...new Set(this)];
}
以上是关于为Array对象添加一个去重的方法(ES5和ES6的实现)的主要内容,如果未能解决你的问题,请参考以下文章