JS的Set

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /**
     * Set介绍:
     *        个人觉得和Java的HashSet差不多,不存在重复值,没有顺序
     * 操作方法:
     *        add          :添加值add(value):添加某个值,返回 Set 结构本身(可以链式调用)。
     *        delete(value):删除某个值,删除成功返回 true,否则返回 false。
     *        has(value)   :返回一个布尔值,表示该值是否为 Set 的成员。
     *        clear()      :清除所有成员,没有返回值。
     *
     * 循环方法:
     *        keys()       :返回键名的遍历器。
     *        values()     :返回键值的遍历器。
     *        entries()    :返回键值对的遍历器。
     *        forEach()    :使用回调函数遍历每个成员。
     *
     * 注意点:
     *        两个undefined在一起是相等的,所以不可重复
     *        -0和+0是相等的,不可重复
     *        NaN 与 NaN 是不恒等的,但是在 Set 中认为 NaN 与 NaN 相等,所有只能存在一个,不重复。
     *        由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以 keys 方法和 values 方法的行为完全一致。
     *        Array 和 Set 对比
     *
     *        Array 的 indexOf 方法比 Set 的 has 方法效率低下
     *        Set 不含有重复值(可以利用这个特性实现对一个数组的去重)
     *        Set 通过 delete 方法删除某个值,而 Array 只能通过 splice。两者的使用方便程度前者更优
     *        Array 的很多新方法 map、filter、some、every 等是 Set 没有的(但是通过两者可以互相转换来使用)
     */
    let set = new Set()
    set.add({name: "晨晨", age: 66})
    set.add({name: "晨晨", age: 66})
    set.add(undefined)
    set.add(undefined)
    set.add(+0)
    set.add(-0)
    console.log(set)

    // 应用场景1:去重
    let different = new Set([1, 2, 1, 4])
    console.log(different)

    // 应用场景2:实现并集、交集、差集
    let a = new Set([1, 3, 4, 7])
    let b = new Set([1, 5, 2, 3])

    let combineArr = new Set([...a, ...b]) // 并集
    let connectArr = new Set([...a].filter(item => { // 交集
        return [...b].indexOf(item) !== -1
    }))
    let decreaseArr = new Set([...a].filter(item => { // 差集
        return [...b].indexOf(item) === -1
    }))
</script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值