JS基于数据引用类型实现集合结构

function MySet() {
    // 初始化
    this.items = {};
    
    // 添加元素
    MySet.prototype.add = function(data) {

        if(this.has(data)) return false;

        Object.defineProperty(this.items, data, {
            value : data,               // 该data属性的值,默认undefine
            writable : true,            // 该data属性的值可修改,默认false
            enumerable : true,          // 该data属性可枚举,默认false
            configurable : true         // 该data属性可修改,默认false
          });

        //this.items[data] = data;  等价?
 
        return true;
    }

    // 判断是否含有改属性
    MySet.prototype.has = function(data) {
        return this.items.hasOwnProperty(data);
    }

    MySet.prototype.remove = function(data) {
        if(!this.has(data)) return false;
        delete this.items[data];
        return true;
    }

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

    MySet.prototype.size = function() {
        return Object.keys(this.items).length;
    }
    // 打印元素
    MySet.prototype.values = function() {
        return Object.keys(this.items);
    }

    /*集合间的操作 */
    //并集
    MySet.prototype.union = function(otherSet) {
        // 创建并集
        var unionSet = new MySet();
        
        // 将当前对象的属性复制给并集
        for (const key in this.items) {
            if (this.items.hasOwnProperty(key)) {
                unionSet.add(key);
            }
        }

        // 将另外一个集合复制给并集
        for (const key in otherSet.items) {
            if (otherSet.items.hasOwnProperty(key)) {
                unionSet.add(key);
            }
        }

        // 返回并集
        return unionSet;
    }

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

        for (const key in this.items) {
            if (this.items.hasOwnProperty(key)) {
                if (otherSet.items.hasOwnProperty(key)) {
                    intersection.add(key);
                }
            }
        }
        return intersection;
    }

    // 差集 返回 我有 otherSet没有的元素
    MySet.prototype.difference = function(otherSet) {
        var difference = new MySet();

        for (const key in this.items) {
            if (this.items.hasOwnProperty(key)) {
                if (!otherSet.items.hasOwnProperty(key)) {
                    difference.add(key);
                }
            }
        }
        return difference;
    }

    // 子集 判断 我的所有元素 otherset都有
    MySet.prototype.subSet = function(otherSet) {
        for (const key in this.items) {
            if (this.items.hasOwnProperty(key)) {
                if (!otherSet.items.hasOwnProperty(key)) {
                    return false;
                }
                
            }
        }

        return this.size() > otherSet.size() ? false:true ;
    }
}
var ms = new MySet();
ms.add("2")
ms.add("3")
var other = new MySet();
other.add("3")
other.add("8")
other.add("9")

console.log(ms.subSet(other))

 

posted @ 2020-04-05 16:11  正义de键盘侠  阅读(141)  评论(0)    收藏  举报