利用ES6 新特性Set数据结构进行数组去重

ES6 之前的数组去重

在ES6之前的数组去重,我们一般会对数组进行双重循环取值比较操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 之前的数组去重
let beforeDisRepeat = (arr) => {
let tempArr = [arr[0]]

wrapper:
for(itemOld of arr){
for(itemNew of tempArr) {
if(itemOld === itemNew){ continue wrapper }
}
tempArr.push(itemOld)
}
return tempArr
}

tip: wrapper是一个label,当两个取值相等,则无须进行这一次的后续循环取值操作。
直接continue到外层循环。 for...of...属于ES6的特性,在这里用来取代for( ; ; )

// 由于NaN不等于自身,如果数组中存在多个NaN的情况下,仍然不能去除。
// 若要去除的话,可以利用isNaN()函数进行判定。不过代码略显累赘。

利用ES6的新特性Set数据结构

1
2
3
4
5
6
7
8
9
let disRepeat = (arr) => {
return Array.from(new Set(arr)) // return [...new Set(arr)]
}

// new Set(arr)便把arr转换为Set数据结构类型,arr中有重复的值这时也会被set特性去除。

// 然后我们可以利用Array.from()方法将Set结构转为数组,也可以利用扩展运算符。
// 且在Set中NaN等于自身。这便可以解决上述代码不足。
// 扩展运算符内部亦是使用for...of...循环

Set数据结构介绍

  • Set数据结构类似于数组,但是成员值都是唯一的。
  • 向Set中加入值的时候set.add(x),不会发生类型转换。因此 ‘1’与 1并不相等。
  • Set本身是一个构造函数,接受一个数组或其他具有iterable接口的数据结构作为参数,用以初始化。
  • Set结构实例所具有的属性

    • Set.prototype.constructor : 构造函数原型,默认就是Set
    • Set.prototype.size : 返回Set实例的成员总数,通Array.length
  • Set操作方法

    1. add() : 添加某个值,返回set实例本身
    2. delete() : 删除某个值, 返回一个boolean,表示是否删除成功
    3. has() : 返回一个boolean,表示该值是否是该Set实例的成员
    4. clear() : 清除所有成员, 无返回值。
  • Set遍历方法

    1. keys() : 返回键名
    2. values() : 返回键值
    3. entries() : 返回键值对
    4. forEach() : 使用回调函数遍历每一个成员
文章作者: Luo Jun
文章链接: /2018/02/11/ArrayDisRepeat/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Aning