• ES6 学习 -- Set和Map数据结构


    一、Set对象数据结构

    1.Set数据结构类似数组,但是其每个成员都是唯一值,没有重复,且Set本身是一个构造函数,用来生成Set数据结构,用法如下:

    const setData = new Set([1, 2, 1, 3, 5]);
    console.log(setData); // 打印 1,2,3,5

    ***Set结构的数据中,5和"5"是不同的值,Set内部判断两个值是否不同,使用的算法叫做“Same-value equality”,它类似于精确相等运算符(===),主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身,但是在set实例里面NaN与NaN是相同的值,对象也是不同的两个数据(即使完全一致的对象)***

    Set实例拥有的属性
    Set.prototype.constructor: 构造函数,默认就是Set
    Set.prototype.size: 返回Set实例成员总数

    2.Set实例的方法:
    let set = new Set([1, 2, 5, 6]);
    set.add(value): 添加某个值,返回Set实例
    set.delate(value): 删除某个值,返回一个boolean值,表示删除是否成功
    set.has(value): 返回一个boolean值,表示该值是否为Set实例的成员
    set.clear(): 清除所有成员,没有返回值

    ***Set和扩展运算符结合,可以轻松对数组去重

    let ary = [1, 2, 3, 2, 3, 5]

    let ary1 = [...new Set(ary)] // [1, 2, 3, 5]

    ***数组的map和filter方法同样可以用于Set实例

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

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

    // set1 返回值为[2, 4, 6]

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

    set2 = new Set([...set2].filter(x => x % 2 === 0)) // 求可以对2进行整除的数值

    // set2 返回值为[2, 4]

    ***运用数组的map和filter方法,搭配Map的has()方法,可以实现两个数组的并集、交集和差集,如下:

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

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

    // 并集

    let union = new Set([...a, ...b])   // union = { 1, 2, 3, 4 }

    // 交集

    let intersect = new Set(...a.filter(x => b.has(x)))   // intersect = [2, 3]

    // 差集

    let diff = new Set(...a.filter(x => !b.has(x)))   // diff = [4]

    示例:

    let set1 = new Set()

    const a = NaN

    const b = NaN

     set1.add(a)

    set1.add(b)

    console.log(set1) // NaN

    上面代码向Set实例添加了两个NaN,但是只能加入一个。这表明,在Set内部,两个NaN是相等。

    3.Array.from方法可以将Set实例结构转化成数组,如:Array.from(set); // [1 ,2, 5, 6]
    数组去重的另一种实现方法:
    function dedupe(array) {
    // 先将需要去重的数组作为参数传递给Set构造函数,去重处理后通过Array.from转化成数组
    return Array.from(new Set(array));
    }
    var result = dedupe([1, 2, 5, 1,8]); // result = [1, 2, 5, 8]

    4.Set遍历:
    keys(): 返回键名的遍历器
    values(): 返回键值的遍历器
    entries(): 返回键值对的遍历器(每次遍历出来的都是一个数组[key,value])
    forEach(): 使用回调函数遍历每个成员

    **因为Set实例没有键名,只有键值,所有键名和键值都是同一个值,故keys方法与values方法结果完全一致
    for(let item of set.keys()) {
    console.log(item); //打印结果为1、2、5、8
    }
    // forEach()遍历
    set.forEach((value, key)=>{console.log("key:"+key+" value:"+value)})

    二、Map数据结构
    1.Map是新型的对象数据解构,ES5、ES3的对象的键只能是字符串,而ES6中的Map数据结构键名可以是任意类型的数据
    const map = new Map();
    const obj = {name: "bob"};

    map.set(obj, "hello world"); // 以对象obj作为键名
    map.get(obj); // "hello world" // 获取键名对应的键值

    map.has(obj); // true 检查Map实例是否含有键名obj
    map.delate(obj); // true 删除Map实例的obj键值对,如果存在这个键值对,则返回true,反之返回false
    map.has(obj); // false

    const m = new Map([
    ["a", 1],
    ["b", 2]
    ])
    m.size // 2
    m.has("a") // true
    m.get("a") // 1

    // Map数据结构如果对同一个键名多次赋值,那么最后一次的覆盖前面的
    // 如果读取一个未知的键,则返回undefined
    // Map的键实际是跟内存地址绑定的,只要内存地址不同,就视为两个键,但是如果键是一个简单的值(数字、字符串、布
    尔值),Map将其视为同一个键,如0和-0或者+0是同一个键,布尔值true跟字符串true不是同一个键,undefined和null也不
    是同一个键。而NaN虽然不等于NaN,但是Map将其视为同一个键

    2.Map实例的属性和操作方法
    (1)size属性 --- 返回Map结构的成员数量
    (2)set(key, value) --- 设置键值,键名为key,键值是value,如果键名key已经存在,则覆盖之前的value值,否则生成
    一个新的键值对
    (3)get(key) --- 读取键名key对应的键值,如果找不到key对应的键名,则返回undefined
    (4)has(key) --- 检查Map实例是否含有键key,没有则返回false,反之返回true
    (5)delate(key) --- 删除键名key对应的键值对
    (6)clear() --- 清空Map实例的所有键值对

    3.Map遍历方法:
    与Set实例一样,都存在四个遍历方法,keys()、values()、entries()、forEach()
    keys() // 遍历Map实例的所有键
    values() // 遍历出Map实例的键所对应的value值
    entries() // 遍历Map实例的所有键值对

  • 相关阅读:
    Codeforces 1131 C. Birthday-暴力 (Codeforces Round #541 (Div. 2))
    Codeforces 1131 B. Draw!-暴力 (Codeforces Round #541 (Div. 2))
    DP之背包经典三例
    博弈规律综概
    腾讯面试题:杯子质量(最优查找)
    洛谷P1308——单词统计
    AtCoder Regular Contest 069 D
    Codeforces 782C. Andryusha and Colored Balloons 搜索
    Codeforces 799D. String Game 二分
    Codeforces 767B. The Queue 模拟题
  • 原文地址:https://www.cnblogs.com/secretAngel/p/9699389.html
Copyright © 2020-2023  润新知