美文网首页
Set学习记录

Set学习记录

作者: 不负好时光_9c46 | 来源:发表于2019-05-16 17:08 被阅读0次

前言:参考文章ECMAScript 6 入门

本文连接:https://www.jianshu.com/p/0f957a2453b5

Set是Es6提供的一种新的数据结构。

一、Set的特性:

        1、它与Array类似,但是它的成员值是唯一的,不重复的。

        2、键名(key)和键值(value)相等

        3、Set函数可以接受一个数组,或者具有iterable接口的其他数据结构作为参数,来初始化

        4、在Set内部NaN是相等的,两个空对象不相等

        5、Array.from方法可以将Set结构转为数组

        6、Set的遍历顺序就是插入顺序

二、Set的属性

        1.Set.prototype.constructor    //构造函数,默认就是Set函数

        2.Set.prototype.size     // 返回Set实例的成员总数

三、Set实例的方法分为两个大类:操作方法 和遍历方法

        1.操作方法

            a.add(value): 添加某个值,返回Set结构本身,重复数据不添加

            b.delete(value): 删除某个值,返回一个布尔值,表示删除是否成功

            c.has(value): 返回一个布尔值,表示该值是否为Set的成员

            d.clear(): 清除所有成员,没有返回值

        2.遍历方法

            a.keys(): 返回键名的遍历器

            b.values(): 返回键值的遍历器

            c.entries(): 返回键值对的遍历器

            d.foreach(): 使用函数遍历每个成员

            由于Set结构没有键名,只有键值(或者说键名和键值是相等的),所以keys方法和values方法的行为完全一致。

 for (let item of set.keys()) {       

  console.log(item)

}

// red

// green

// blue

for(let item of set.values()) {

  console.log(item)

}

// red

// green

// blue

for(let item of set.entries()) {

  console.log(item)

}

// ['red': 'red']

// ['green': 'green']

// ['blue': 'blue']

            Set结构的实例默认可遍历,它的默认遍历器生成函数就是它的values

Set.prototype[Symbol.iterator] === Set.prototype.values

// true

// 这意味着,可以省略values方法,直接用for...of 遍历循环Set

let set = new Set(['red', 'green', 'blue']);

for (let x of set) {

  console.log(x)

}

        Set结构的实例和数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。

        let set = new Set([1, 4, 9]);

        set.forEach((value, key) => console.log(key + ':' + value))

        扩展运算符(...)内部使用for...of循环,所以也可以用于Set结构

et set = new Set(['red', 'green', 'blue']);

let arr = [...set];

// ['red', 'green', 'blue']

        数组的map和filter方法也可以间接的用于Set

let set = new Set([1, 2, 3]);

set = new Set([...set].map(x => x * 2));

// 返回Set结构:{2, 4, 6}

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

set = new Set([...set].filter(x => (x % 2) == 0));

// 返回Set结构: {2, 4}

 四、Set有什么用处?

    1、去除数组重复成员

        a.利用Array.from方法将Set结构转为数组

function dedupe(array) {

  return Array.from(new Set(array));

}

dedupe([1, 1, 2, 3]) // [1, 2, 3]

        b.利用扩展运算符(...)和Set结构相结合

let arr = [3, 5, 2, 2, 5, 5];

let unique= [...new Set(arr)];

// 返回Set结构:{2, 4, 6}

    2、通过使用Set来实现并集(Union)、交集(Intersect)和 差集(Difference)

let a = new Set([1, 2, 3]);

let b = new Set([4, 3, 2]);

        a.并集

 let union = new Set([...a], [...b]);

// Set {1, 2, 3, 4}

        b.交集

let intersect = new Set([...a].filter(x => b.has(x)));

// set {2, 3}

        c.差集

let difference = new Set([...a].filter(x => !b.has(x)));

// Set {1}

五、其他

    如果想在遍历操作中,同步改变原来的Set结构,目前没有直接的方法,但有两种变通方法。一种是利用原来Set结构映射出一个新的结构,然后赋值给原来的Set结构;另外一种是利用Araay.from 方法。

// 方法一

let set = new Set([1, 2, 3]);

set = new Set([...set].map(val => val * 2));

// set的值是2, 4, 6

//方法二

let set = new Set([1, 2, 3])

set = new Set(Array.from(set, val => val * 2))

// set的值是2, 4, 6

相关文章

  • Set学习记录

    前言:参考文章ECMAScript 6 入门 本文连接:https://www.jianshu.com/p/0f9...

  • redis锁

    引用文献:http://doc.redisfans.com/string/set.html (本文仅是用来记录学习...

  • teradata建表DDL

    ●是否允许重复记录❍SET 不允许记录重复CREATE SET TABLE table1 ...❍MULTISET...

  • 记录mysql执行过的sql语句

    启动sql记录日志功能 SET GLOBAL log_output = 'TABLE'; SET GLOBAL ...

  • 学习代码生成alpha、scale、translate、rota

    学习代码生成alpha、scale、translate、rotate、set及插值器动画记录 最近在跟着系列教程学...

  • ES6 Features

    记录部分 ES6语法 Map 和 Set Set Set 类似于数组,成员都是唯一的, Set 内部去重的比较,类...

  • Set学习

    类似数组,与map相似,但是成员的值唯一,没有重复的值。 //阮一峰老师写的一个使用方式: const s=new...

  • mongoDB 的 $set、$setOnInsert 区别

    注意:set中的属性记录不能相同 mongo更新语句使用set、upsert的区别 对于查询到的记录。使用setO...

  • Java基础之Set

    前言 今天学习java基础类型Set,解剖Set的底层实现。 一、Set子类 Set接口继承自Collection...

  • 修改mysql的root密码

    记录一下.方法1: 用SET PASSWORD命令首先登录MySQL。格式:mysql> set password...

网友评论

      本文标题:Set学习记录

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