集合

/* 
概念:
    集合是由一组无序且唯一(即不能重复)的项组成的;
方法:    
     add(element):向集合添加一个新元素。
     delete(element):从集合移除一个元素。
     has(element):如果元素在集合中,返回 true,否则返回 false。
     clear():移除集合中的所有元素。
     size():返回集合所包含元素的数量。它与数组的 length 属性类似。
     values():返回一个包含集合中所有值(元素)的数组。
*/

class Set {
    constructor() {
        this.items = {};
    }
    has(element) {
        /* 
            Object 原型有 hasOwnProperty 方法。该方法返回一个表明对象是否具有特定属性的布尔
            值。in 运算符则返回表示对象在原型链上是否有特定属性的布尔值。
        */
        // return element in items;
        return Object.prototype.hasOwnProperty.call(this.items, element);
    }
    add(element) {
        if(!this.has(element)) {
            this.items[element] = element;
            return true;
        }
        return false;
    }
    delete(element) {
        if (this.has(element)) {
            delete this.items[element];
            return true;
        }
        return false;
    }
    clear() {
        this.items = {};
    }
    size() {
        return Object.keys(this.items).length;
    }
    sizeLegacy() {
        let count = 0;
        for (let key in this.items) {
            /* 
            还需要使用 has 方法(以验证 items 对象具有该属性),因为对象的原
            型包含了额外的属性(属性既有继承自 JavaScript 的 Object 类的,也有属于对
            象自身、未用于数据结构的)
            */
            if (this.items.hasOwnProperty(key)) {
                count++;
            }
        }
        return count;
    }
    values() {
        /* 
        Object.values()方法返回了一个包含给定对象所有属性值的数组。它是在
        ECMAScript 2017 中被添加进来的,目前只在现代浏览器中可用
        */
        return Object.values(this.items);
    }
    valuesLegacy() {
        let values = [];
        for (let key in this.items) {
            if (this.items.hasOwnProperty(key)) {
                values.push(key);
            }
        }
        return values;
    }
    // 并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。
    union(otherSet) {
        const unionSet = new Set();
        this.values().forEach(value => unionSet.add(value));
        otherSet.values().forEach(value => unionSet.add(value));
        return unionSet;
    }
    // 交集:包含两个集合中共有元素的新集合
    intersection(otherSet) {
        const intersectionSet = new Set();
        const values = this.values;
        for (let i = 0; i < values.length; i++) {
            if(otherSet.has(valuesp[i])) {
                intersectionSet.add(values[i])
            }
        }
        return intersectionSet;
    }
    // 优化代码--迭代元素的次数更少--意味着更少的过程消耗
    intersectionTwo(otherSet) {
        const intersectionSet = new Set();
        const values = this.values();
        const otherValues = otherSet.values();
        let biggerSet = values;
        let smallerSet = otherValues;
        if(otherValues.length - values.length > 0) {
            biggerSet = otherValues;
            smallerSet = values;
        }
        smallerSet.forEach(value => {
            if(biggerSet.includes(value)) {
                intersectionSet.add(value)
            }
        });
        return intersectionSet;
    }
    // 差集:包含所有存在于第一个集合且不存在于第二个集合的元素的新集合(所有存在于集合 A 但不存在于集合 B 的元素)
    difference(otherSet) {
        const differenceSet = new Set();
        this.values().forEach(value => {
            if(!otherSet.has(value)){
                differenceSet.add(value);
            }
        });
        return differenceSet;
    }
    // 子集::验证一个给定集合是否是另一集合的子集
    isSubsetOf(otherSet) {
        if (this.size() > otherSet.size()) {
            return false;
        }
        /* 
        只要回调函数返回 true,every 方法就会被调用。如果
        回调函数返回 false,循环会停止
        */
        let isSubset = true;
        this.values().every(value => {
            if (!otherSet.has(value)) {
                isSubset = false;
                return false;
            }
            return true;
        });
        return isSubset;
    }
}

 

posted @ 2021-07-06 13:51  小白咚  阅读(57)  评论(0编辑  收藏  举报