js数据结构学习---集合

6.集合

常见的实现方式是哈希表(后续学习),在这主要以封装集合类来实现。在2015年6月发布的es6中已经 包含了set类,所以在这里通过手动封装让我们了解set类内部实现机制。

注意:本内容主要探讨集合有哪些方法,其兼容问题是不包含在本节所要讲的内容中

6.1集合特点

  • 是一组无序的,不重复的元素构成

  • 意味着不能通过下标值进行访问,相同的对象在集合中是不能重复的,只存在一份

6.2集合的常见操作

  • add(value):向集合添加一个新的项

  • remove(value):从集合移除一个值

  • has(value):判断某个值是否在集合中。如果值在集合中,返回true,否则返回false

  • clear():移除集合中的所有项

  • size():返回集合所包含元素的数量

  • values():返回一个包含集合中所有值的数组

6.3集合操作的实践

6.3.1集合整体实现预览

function Set(){
    //属性
    this.items = {}//object对象,对象的keys本身为一个set类
    Set.prototype.has = function (value) {}
    Set.prototype.add = function (value) {}
    Set.prototype.remove = function (value) {}
    Set.prototype.clear = function () {}
    Set.prototype.size = function () {}
    Set.prototype.values = function () {}
}

6.3.2has方法

Set.prototype.has = function (value) {
        return this.items.hasOwnProperty(value)//当前对象里面是否包含某个键
    }

6.3.3add方法

Set.prototype.add = function (value) {
        //判断当前集合中是否已经包含了该元素
        if (this.has(value))
            return false
        this.items[value] = value
        return true
    }

6.3.4remove方法

Set.prototype.remove = function (value) {
        //判断该集合中是否包含该元素
        if (this.has(value)) {
            delete this.items[value]//将元素从对象中删除
            return true
        }
        return false
    }

6.3.5clear方法

Set.prototype.clear = function () {
        this.items = {}
    }

6.3.6size方法

Set.prototype.size = function () {
        return Object.keys(this.items).length//获取对象中keys的个数
    }

6.3.7values方法

Set.prototype.values = function () {//获取集合的值
        return Object.values(this.items)
    }

6.4集合的数学操作

6.4.1集合并集

对于给定的两个集合,返回一个包含两个集合中所有元素的新集合

解题思路:

  • 先创建一个新集合,代表两个集合的并集

  • 遍历集合A中所有值,并添加到新集合中

  • 遍历集合B中所有值 ,并添加到新集合中

  • 将最终新集合返回

Set.prototype.union = function (setB) {
        var setC = new Set()
        for (var i in this.items) {
            setC.add(this.items[i])
        }
        for (var j in setB.items) {
            setC.add(setB.items[j])
        }
        return setC
​
    }

6.4.2集合交集

对于给定的两个集合,返回一个包含两个集合中共有元素的新集合

 

解题思路:

  • 首先创建一个新集合,代表两个集合的并集

  • 遍历集合A中所有的值,判断该元素是否在集合B中

  • 在集合B中则将该元素加入到新集合

  • 最后将新集合返回

Set.prototype.intersection = function (setB) {
        var setC = new Set()
        for (var i in this.items) {
            if (setB.has(this.items[i])) {
                setC.add(this.items[i])
            }
        }
        return setC
​
    }

6.4.3集合差集

对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合

 

解题思路:

  • 首先创建一个新集合

  • 遍历集合A中所有元素,判断是否在集合B中

  • 不存在于集合B中,将该元素添加到新集合中

  • 最后将新集合返回

Set.prototype.difference = function (setB) {
        var setC = new Set()
        for (var i in this.items) {
            if (!setB.has(this.items[i])) {
                setC.add(this.items[i])
            }
        }
        return setC
    }

6.4.4集合子集

验证一个给定集合是否是另一集合的子集,A里面的元素都包含在B中

 

解题思路:

  • 判断集合A是否大于集合B如果大于,那么 肯定不是集合B的子集

  • 不大于的情况下:

    • 判断集合A中的元素是否都在集合B中存在

    • 存在返回true,不存在则返回false

Set.prototype.subset = function (setB) {
        var setC = new Set()
        if (this.values().length >setB.values().length) return false
        for (var i in this.items) {
            if (!setB.has(this.items[i])) {
                return false
            }
        }
        return true
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进阶的菜熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值