JavaScript --- 集合

1、什么是集合?
集合是由一组无序且唯一(不能重复)的项组成的,这个数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中;以下内容主要以来实现一个ECMAScript 6中Set类的实现为基础。
2、实现我们的Set集合(MySet):

function MySet(){
    var items = {};//这里使用的是对象,而不是数组

    this.has = function(value){
        return items.hasOwnProperty(value);//return value in items;
    };

    this.add = function(value){
        if(!items.has(value)){
            items[value] = value;
            return true;
        }
        return false;
    };

    this.remove = function(value){
        if(this.has(value)){
            delete items[value];
            return true;
        }
        return false;
    };

    this.clear = function(){
        items = {};
    };

    this.size = function(){
        return Object.keys(items).length;
    };

    this.sizeLegacy = function(){
        var count = 0;
        for(var porp in items){
            if(items.hasOwnProperty(prop)){
                ++count;
            }
        }
        return count;
    };

    this.values = function(){
        var keys = [];
        for(var key in items)
        {
            if(items.hasOwnProperty(key)){
                keys.push(key);
            }
        }
        return keys;
    };

    this.union = function(otherSet){
        var unionSet = new MySet();

        //第一个集合
        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;
    };

    //交集
    this.intersection = function(otherSet){
        var intersectionSet = new MySet();

        //当前集合
        var values = this.values();
        for(var i=0;i<values.length;i++)
        {
            if(otherSet.has(values[i])){//判断当前值在第二个集合中是否存在
                intersectionSet.add(values[i]);//添加
            }
        }
        return intersectionSet;
    };

    //差集
    this.differennce = function(otherSet){
        var differennce = new MySet();

        //当前集合
        var values = this.values();
        for(var i=0;i<values.length;i++){
            if(!otherSet.has(values[i])){
                differennce.add(values[i]);
            }
        }
        return differennce;
    };

    //子集
    this.subset = function(otherSet){
        if(this.size() > otherSet.size())//子集不能比包含它的集合大
        {
            return false;
        }
        var values = this.values();
        for(var i=0;i<values.length;i++)
        {
            if(!otherSet.has(values[i]))
            {
                return false;
            }
            return true;
        }
    };
}

3、使用我们实现的MySet集合,并简单介绍集合中方法:

//add方法主要用于向集合中添加元素,并且保证元素在集合中的唯一性
var set = new MySet();
set.add(1);
set.add(2);
console.log(set.itmes);//Object {1:1,2:2}


//values 以数组的形式输出集合中的所有元素
//has 判断一个元素在集合中是否存在(存在返回true,反之返回false)
//size 返回当前集合的大小
//remove 在集合中移除指定的元素
var set = new MySet();
set.add(1);
console.log(set.values());//["1"]
console.log(set.has(1));//true
console.log(set.size());//1
set.add(2);
console.log(set.values());//["1","2"]
console.log(set.has(2));//true
console.log(set.size());//2
set.remove(1);
console.log(set.values());//["2"]
set.remove(2);
console.log(set.values());//[]


//union 并集,合并集合A(setA)和集合B(setB)中的元素
var setA = new MySet();//集合A
setA.add(1);
setA.add(2);
setA.add(3);

var setB = new MySet();//集合B
setB.add(3);
setB.add(4);
setB.add(5);
setB.add(6);
var unionAB = setA.union(setB);
console.log(unionAB);//["1","2","3","4","5","6"]


//intersection 交集,取出集合A(setA)和集合B(setB)中的共同元素
var setA = new MySet();//集合A
setA.add(1);
setA.add(2);
setA.add(3);

var setB = new MySet();//集合B
setB.add(2);
setB.add(3);
setB.add(4);
var intersectionAB = setA.intersection(setB);
console.log(intersectionAB);//["2","3"]


//differennce 差集,取值集合A(setA)的差集(在集合A中有出现的元素,但是在集合B中不存在的元素)
var setA = new MySet();//集合A
setA.add(1);
setA.add(2);
setA.add(3);

var setB = new MySet();//集合B
setB.add(2);
setB.add(3);
setB.add(4);
var differennceAB = setA.differennce(setB);
console.log(differennceAB);//["1"]


//subset 子集,判断集合A是否是集合B的子集(因为集合B中包含了集合A中的所有元素,所以是属于子集,返回true)
var setA = new MySet();//集合A
setA.add(1);
setA.add(2);

var setB = new MySet();//集合B
setB.add(1);
setB.add(2);
setB.add(3);
var subsetAB = setA.subset(setB);
console.log(subsetAB);//true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值