ES2015中的set数据结构

作者: 忽如寄 | 来源:发表于2017-01-24 15:52 被阅读86次

    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));
    }
    

    相关文章

      网友评论

        本文标题:ES2015中的set数据结构

        本文链接:https://www.haomeiwen.com/subject/jvpzbttx.html