ES2015中的set数据结构

set数据结构被翻译成集合,说明这种数据结构是不会有重复值的,同样JavaScript中的set数据结构类似于数组,但没有重复值。set这种数据结构的声明使用一个构造函数Set(),声明时可以传入一个数组的作为参数用来初始化这个set,可以使用实例方法add()向set中添加元素,可以使用for…of…对这种类数组的set进行遍历

let arr = [1, 2,3,4,4,5,5];
let s = new Set();

arr.forEach(e => s.add(e));
for(let val of s) {
    console.log(val);  
}
// 1
// 2
// 3
// 4
// 5

将这个数组在set声明的时候作为参数传入可以达到同样的效果

let arr = [1, 2,3,4,4,5,5];
let s = new Set(arr);
for(let val of s) {
    console.log(val);  
}

可以使用set实例属性size获取这个set的成员的个数

let arr = [1, 2,3,4,4,5,5];
let s = new Set(arr);
a.size;
// 5

显然可以使用set的初始化来做数组去重,通过Array.from()方法将set转化为数组即可。传统方法中一般使用indexOf方法来判断这个值是否与for循环中的i相等,从而选择性剔除来做数组去重

// 传统方法

// 方法一
function unique(arr) {
    let arr2 = [];
    for(let i = 0, max = arr.length; i < max; i++) {
        if(arr2.indexOf(arr[i] == i) {
            arr2.push(arr[i]);
        }
    }
}
// 方法二
function unique(arr) {
    let arr2 = [];
    for(let i = 0, max = arr.length; i < max; i++) {
        if(arr2.indexOf(arr[i]) < 0) {
            arr2.push(arr[i]);
        }
    }
}
// 方法三
function unique(arr) {
    return arr.filter(function(ele, index, arr) {
        return arr.indexOf(ele) === index;
    });
}
// ES2015方法一
function unique(arr) {
    return Array.from(new Set(arr));
}

// ES2015方法二,进一步深化ES2015,使用拓展运算符...
function unique(arr) {
    return [...new Set(arr)]
}

set实例的属性和方法

1、属性
1、size:返回set的成员个数

let set = new Set();
set.add(1).add(2);
set.size;
// 2

2、方法
1、add():添加一个成员,返回set本身,这就说明这个方法可以使用链式调用。

let set = new Set();
set.add(1).add(2);

2、delete():删除一个成员,返回布尔值,说明是否删除成功,删除失败最常见的就是set中没有这个成员。

let set = new Set();
set.add(1).add(2);
set.delete(1);
// true
set.delete(3);
// false

3、has():判断set中是否存在某个成员,返回布尔值

let set = new Set();
set.add(1).add(2);

set.has(1);
// true
set.has(3);
// false

4、clear():清除set中的所有成员,没有返回值

let set = new Set();
set.add(1).add(2);

set.size;
// 2
set.clear();

set.size;
// 0

5、keys():遍历键值,但是由于set没有键,返回的就是值

let set = new Set();
set.add(1).add(2);

for(let item of set.keys()) {
    console.log(item);
}
// 1
// 2
//当然set本身就是一种类数组的数据结构,直接使用for...of...就已经可以遍历

6、values():遍历set中的值,表现和keys()方法一样
7、entries():遍历键值对,同样因为set没有键,返回的键就是和值一样

let set = new Set();
set.add(1).add(2);

for(var item of set.entries()) {
    console.log(item);
}
// [1, 1]
// [2, 2]

数组的map方法和filter方法同样适用于set,这两个方法返回新的set

实现set集合的交并补如下:

// 并集
function union(set1, set2) {
    return new Set([...set1, ...set2]);
}
// 交集
function intersect(set1, set2) {
    return new Set([...set1]).filter(x => set2.has(x));
}
// 补集
function diff(set1, set2) {
    return new Set([...set1]).fiter(x => !set2.has(x));
}
    原文作者:忽如寄
    原文地址: https://www.jianshu.com/p/b4c002eb85c9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞