JS数据结构与算法 —— 集合,并集,交集,补集

概念:集合是由一组无序且唯一(每个元素只出现一次)的项组成的一组数据。其与数学里的集合是同一个概念。在ES6里已经引入了集合的数据结构概念——Set类。

分类:常见的有空集,并集,交集,差集。

应用场景:1)数据去重;2)用于存储一些独一无二的数据。

js实现一个集合

集合的特性类似于JavaScript数据类型里的Object,Object对象里的每个键都是唯一。下面用一个名为item的对象表示集合去实现一个简单的集合类。其中集合里的元素是以{value:value}值值对的形式存储的

定义Skipper类,表示集合,其中包含了如下几个操作方法(为了方便阅读,已把方法从类里提取出来展示)

class Skipper{
    constructor(){
        this.item = {};    // 一个集合(值值对,如value : value)
    }
}

查找元素方法

    has(element){           
        return this.item.hasOwnProperty(element);
    }

新增元素方法

    add(element){           
        if(!this.has(element)){
            this.item[element] = element;
            return 'success';
        }else{
            return '该元素已存在';
        }
    }

删除元素方法

    remove(element){        
        if(this.has(element)){
            delete this.item[element];
            return 'success';
        }else{
            return '该元素不存在';
        }
    }

清空元素方法

    clear(){                
        this.item = {};
    }

查看集合大小

    size(){                
        return Object.keys(this.item).length;    // 由item对象的键组成的数组的长度
    }
   

提取集合所有元素并组合成的一个数组

    values(){               
        let arr = [];
        for(let key in this.item){
            arr.push(this.item[key]);
        }
        return arr;
    }

查看完整源码

 

并集类

给定两个集合A,B,把他们所有的元素合并在一起组成的集合,叫做集合A与集合B的并集,记作A∪B,读作A并B。

class Union{
    getSkipper(A,B){
        let result = new Skipper();
        A.values().forEach(element=>{            // 遍历第一个集合
            result.add(element);   // add()已去重
        });
        B.values().forEach(element=>{       // 遍历第二个集合
            result.add(element);
        });
        return result;
    }
}

交集类

设A,B是两个集合,由所有属于集合A属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection),记作A∩B。

class Intersection{
    getSkipper(A,B){
        let result = new Skipper()
        A.values().forEach(element=>{
            if(B.has(element)){
                result.add(element);    
            }
        });
        return result
    }
}

补集类

由A中所有不属于B的元素组成的集合,叫集合B在A中的补集,又称差集。

class Difference{
    getSkipper(A,B){
        let result = new Skipper();
        A.values().forEach(element=>{
            if(!B.has(element)){
                result.add(element);
            }
        });
        return result;
    }
}

更多数据结构相关,请查看专栏:《JavaScript数据结构与算法》

(完)

你可能感兴趣的:(☛,JavaScript(ES6),☛,JS数据结构与算法,js数据结构与算法,集合,并集,交集,补集)