zoukankan      html  css  js  c++  java
  • 集合 Set

    集合 Set

    备注:基本借鉴 MDN

    集合Set---MDN文档链接

    因为是个新的对象,还比较好用,经常使用有 去重、取交集、并集、差集等等。
    这里重点学习下,并学学常用场景


    一、描述

    Set 对象允许你存储任何类型的唯一值,无论是原始值或者对象引用

    Set 对象是值的集合,可以按照插入的顺序迭代它的元素。

    Set 中的元素只会出现一次,即 Set 中的元素时唯一的


    特殊点:

    NaN 和 undefined 都可以被存储在 Set 中, NaN 之间被视为相同的值(虽然在 js 中, NaN !== NaN)


    二、语法

    语法

    new Set([iterable])
    
    [iterable]:
        若 [iterable] 为一个可迭代对象,比如数组 [1, 2, 3, 3, 4]---({a: 1, b: 1} 是不可迭代的)
        它的所有元素将不重复的添加到新的 Set 中
        若不指定或为 null,则新的 Set 为空
    

    使用

    let set1 = new Set() // Set {}
    let set2 = new Set([1, 2, 3]) // Set {1, 2, 3}
    let set3 = new Set('hello') // Set {"h", "e", "l", "o"}
    

    三、属性

    常用属性 size: 表示 Set 对象值的个数

    let set1 = new Set([1, 2, 3]) // Set {1, 2, 3}
    set1.size // 3
    

    四、方法

    1、 add: 在 Set 对象尾部添加一个元素。返回改 Set 对象

    语法:
    Set.prototype.add(value)
    
    使用:
    let set = new Set([0, 1])
    set.add(2) // Set {0, 1, 2}
    

    2、 clear: 移除 Set 对象内的所有元素

    语法:
    Set.prototype.clear()
    
    使用:
    let set = new Set([0, 1])
    set.clear() // Set {}
    

    3、delete: 移除 Set 的中与这个值相等的元素

    语法:
    Set.prototype.delete(value)
    
    使用:
    let set = new Set([0, 1])
    set.delete(0) // 删除元素存在且删除成功返回 true,否则返回 false。 (Set {1})
    

    4、 entries: 返回一个新的迭代器对象

    该对象包含 Set 对象中的按插入顺序排列的所有元素的值的[value, value]数组。每个值的键和值相等

    迭代器对象,必须使用 [...iterableObj] 或者 for (let key of obj) 等方式才能使用

    语法:
    Set.prototype.entries()
    
    使用:
    let set = new Set('hello')
    
    // set.entries()
    // SetIterator 
    //     0: {key: "h", value: "h"}
    //     1: {key: "e", value: "e"}
    //     2: {key: "l", value: "l"}
    //     3: {key: "o", value: "o"}
    let entriesSet = set.entries() 
    
    这里即可看到上面所说的 [value, value] 数组
    // [...entriesSet]
    // [
    //  ["h", "h"]
    //  ["e", "e"]
    //  ["l", "l"]
    //  ["o", "o"]
    // ]
    let enrriesArr = [...entriesSet]
    
    // for of
    for (let set of entriesSet) { // 也可以这么写 for (let [key, value] of entriesSet) {
        console.log('set:', set)
        // set:["h", "h"]
        // set:["e", "e"]
        // set:["l", "l"]
        // set:["o", "o"]
    }
    

    5、 forEach: 按照插入顺序,为 Set 对象中的每一个值调用一次 callBackFn。

    如果提供了 thisArg 参数,回调中的 this 会是这个参数。

    语法:
    Set.prototype.forEach(callbackFn, [thisArg])
    
    使用:
    let set = new Set('hello')
    set.forEach(s => {
        console.log('s:', s)
        // s:h
        // s:e
        // s:l
        // s:o
    })
    

    6、 has: 返回一个布尔值,表示该值在Set中存在与否。

    语法:
    Set.prototype.has(value)
    
    使用:
    let set = new Set('hello')
    set.has('o') // true
    set.has('a') // false
    

    7、 keys: 与 values() 方法相同,返回一个新的迭代器对象

    该对象包含 Set 对象中的按插入顺序排列的所有元素的值。

    迭代器对象,必须使用 [...iterableObj] 或者 for (let key of obj) 等方式才能使用

    语法:
    Set.prototype.keys()
    
    使用:
    let set = new Set('hello')
    
    // keysSet
    // SetIterator 
    //     0: "h"
    //     1: "e"
    //     2: "l"
    //     3: "o"
    let keysSet = set.keys()
    
    // ["h", "e", "l", "o"]
    [...keysSet]
    
    for (let set of keysSet) {
        console.log(set)
        // h
        // e
        // l
        // o
    }
    

    8、 values: 返回一个新的迭代器对象,该对象包含 Set 对象中的按插入顺序排列的所有元素的值。

    迭代器对象,必须使用 [...iterableObj] 或者 for (let key of obj) 等方式才能使用

    语法:
    Set.prototype.values()
    
    使用:
    let set = new Set('hello')
    
    // valuesSet
    // SetIterator 
    //     0: "h"
    //     1: "e"
    //     2: "l"
    //     3: "o"
    let valuesSet = set.values()
    
    // ["h", "e", "l", "o"]
    [...valuesSet] 
    
    for (let set of valuesSet) {
        console.log(set)
        // h
        // e
        // l
        // o
    }
    

    五、常用数据类型转换

    1、 数组转 Set

    let arr = [1, 2, 3, 3]
    let set = new Set(arr) // 可以去重 Set {1, 2, 3}
    

    2、 Set 转数组

    let set = new Set([1, 2, 3])
    let arr = [...set] // [1, 2, 3]
    
    或者 
    let set = new Set([1, 2, 3])
    let arr = Array.from(set) // [1, 2, 3]
    

    3、字符串转 Set

    let string = 'hello'
    let set = new Set(string) // Set {'h', 'e', 'l', 'o'}
    

    六、实际应用场景

    1、数组去重

    let arr = [1, 2, 3, 3, 5, 5, 7, 8, 8, 9]
    let uniArr = [...new Set(arr)] // [1, 2, 3, 5, 7, 8, 9]
    

    2、对于集合的操作

    2、1 并集

    let set1 = new Set([1, 2, 4])
    let set2 = new Set([1, 2, 3, 4])
    for (let set of set2) {
        // 遍历 set2,添加到 set1 中,得到并集
        set1.add(set)
    }
    // 输出并集
    console.log(set1) // Set {1, 2, 4, 3}
    
    或者
    let set1 = new Set([1, 2, 4])
    let set2 = new Set([1, 2, 3, 4])
    [...set2].map(set => set1.add(set))
    let unionSet = [...set1]  //  [1, 2, 3, 4]
    

    2、2 交集

    let set1 = new Set([1, 2, 4])
    let set2 = new Set([1, 2, 3, 4])
    let set3 = new Set()
    for (let set of set2) {
        // 遍历 set2,判断若 set1 中有 set2 当前遍历的元素
        // 则添加到新的 set3 中,得到交集
        if (set1.has(set)) {
            set3.add(set)
        }
    }
    // 输出交集
    console.log(set3) // Set {1, 2, 4}
    
    或者
    let set1 = new Set([1, 2, 4])
    let set2 = new Set([1, 2, 3, 4])
    let finalSet = [...set2].filter(set => set1.has(set)) // [1, 2, 4]
    

    2、3 差集

    求 set1 相对于 set2 的差集

    let set1 = new Set([1, 2, 4, 5])
    let set2 = new Set([1, 2, 3, 4])
    let set3 = new Set()
    for (let set of set1) {
        // 遍历 set1,若 set2 中没有 set1 当前遍历的元素
        // 则添加到新的 set3 中,得到 set1 相对于 set2 的差集
        if (!set2.has(set)) {
            set3.add(set)
        }
    }
    // 输出 set1 的差集
    console.log(set3) // Set {5}
    
    或者
    let set1 = new Set([1, 2, 4, 5])
    let set2 = new Set([1, 2, 3, 4])
    let finalSet = [...set1].filter(set => !set2.has(set)) // [5]
    

    求 set2 相对于 set1 的差集

    let set1 = new Set([1, 2, 4, 5])
    let set2 = new Set([1, 2, 3, 4])
    let set3 = new Set()
    for (let set of set2) {
        // 遍历 set2,若 set1 中没有 set2 当前遍历的元素
        // 则添加到新的 set3 中,得到 set2 相对于 set1 的差集
        if (!set1.has(set)) {
            set3.add(set)
        }
    }
    // 输出 set2 的差集
    console.log(set3) // Set {3}
    
    或者
    let set1 = new Set([1, 2, 4, 5])
    let set2 = new Set([1, 2, 3, 4])
    let finalSet = [...set2].filter(set => !set1.has(set)) // [3]
    

    求 set1 和 set2 的差集总和

    let set1 = new Set([1, 2, 4, 5])
    let set2 = new Set([1, 2, 3, 4])
    for (let set of set2) {
        // 遍历 set2
        // 若 set1 有 set2 当前遍历的元素,则删除 set1 中与该元素相等的值
        // 若没有,则添加进 set1 中
        // 最后的 set1 既是差集总和
        if (set1.has(set)) {
            set1.delete(set)
        } else {
            set1.add(set)
        }
    }
    // 输出 set1 和 set2 的差集总和
    console.log(set1) // Set {5, 3}
    
    都读到最后了、留下个建议如何
  • 相关阅读:
    POJ 1990 MooFest
    python的unittest測试框架的扩展浅谈
    星云測试- Android应用深度体检专业平台
    HDOJ 1507 Uncle Tom's Inherited Land*
    产品设计
    Linux网络编程--wireshark分析TCP包头的格式
    java读取中文分词工具(一)
    为datatable添加自增列
    Oracle 自己主动内存管理 SGA、PGA 具体解释
    TCP/IP基础
  • 原文地址:https://www.cnblogs.com/linjunfu/p/12643533.html
Copyright © 2011-2022 走看看