为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript数据结构之创建一个集合、集合操作

集合是由一组无序且唯一(即不能重复)的项组成的。可以把集合想象成一个既没有重复元素,也没有顺序概念的数组。

声明一些集合可用的方法:
    has(value):如果值在集合中,返回true,否则返回false;
    add(value):向集合添加一个新的项;
    remove(value):从集合移除一个值;
    clear():移除集合中的所有项;
    size():返回集合中包含元素的数量;
    values():返回一个包含集合中所有值的数组;

声明一些集合可用的方法:
    union():并集;
    intersection():交集;
    difference():差集;
    subset():子集:

function Set() {
        //这里使用对象而不是数组来表示集合(items),但也可以用数组来实现
        var items = {}; 

        //has(value)方法 
        this.has = function(value) {
            //所有的JavaScript对象都有hasOwnProperty方法,返回表明对象是否具有特定属性的布尔值
            return items.hasOwnProperty(value);
        };

        //add方法
        this.add = function(value) {
            if (!this.has(value)) { //检查给定的value是否存在于集合中,如果不存在就添加
                items[value] = value;
                return true;
            }
            return false; //如果集合中已经有了这个值,就返回false
        };

        //remove方法
        this.remove = function(value) {
            if (this.has(value)) {
                //如果验证给定的value存在于集合中,那就就移除value
                delete items[value];
                return true; //表示值被移除
            }
            return false;
        };

        //clear方法
        this.clear = function() {
            //要重置对象,只需把一个空对象重新赋值给它
            items = {};
        };

        //size()方法
        this.size = function() {
            //JavaScript的Object类有一个keys方法,它返回一个包含给定对象所有属性的数组
            return Object.keys(items).length;
        };

        //values方法
        this.values = function() {
            //提取items对象的所有属性
            return Object.keys(items);
        };

        //union方法
        this.union = function (otherSet) {
            var unionSet = new Set();//创建一个新的集合,代表并集

            var values = this.values();
            for (var i = 0; i < values.length; i++) {
                unionSet.add(values[i]);
            }

            values = otherSet.values();
            for (var i = 0; i < values.length; i++) {
                unionSet.add(values[i]);
            }
            return unionSet;
        };

        //intersection方法
        this.intersection = function(otherSet) {
            var intersectionSet = new Set();

            var values = this.values();
            for (var i = 0; i < values.length; i++) {
                //遍历当前实例中所有的值,验证它们是否也存在于otherSet实例中
                if (otherSet.has(values[i])) {
                    intersectionSet.add(values[i]);
                }
            }
            return intersectionSet;
        };

        //difference方法
        this.difference = function (otherSet) {
            var differenceSet = new Set();

            var values = this.values();
            for (var i = 0; i < values.length; i++) {
                if (!otherSet.has(values[i])) {
                    differenceSet.add(values[i]);
                }
            }
            return differenceSet;
        };

        //subset方法
        this.subset = function (otherSet) {
            if (this.size > otherSet.size) {
                return false;
            } else {
                var values = this.values();
                for (var i = 0; i < values.length; i++) {
                    if (!otherSet.has(values[i])) {
                        return false;
                    }
                }
                return true;
            }
        };

    }

测试上面代码:

 var setA = new Set();
    setA.add(1);
    setA.add(2);
    setA.add(3);
    setA.add(4);
    var setB = new Set();
    setB.add(3);
    setB.add(4);
    setB.add(5);
    setB.add(6);
    var setC = new Set();
    setC.add(1);
    setC.add(2);
    setC.add(3);
    setC.add(4);
    setC.add(5);

    var unionAB = setA.union(setB);
    console.log(unionAB.values());

    var intersectionAB = setA.intersection(setB);
    console.log(intersectionAB.values());

    var differenceAB = setA.difference(setB);
    console.log(differenceAB.values());

    console.log(setA.subset(setB));
    console.log(setA.subset(setC));
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消