JavaScript实现集合

63 阅读1分钟

集合特点: 无序;不能重复

/**
* @Description: 集合
* @Author: 谭舒琪
* @Date: 2022-12-29 14:19:12
* @LastEditTime: 2022-12-29 14:19:12
* @LastEditors: Please set LastEditors
*/


function Set() {
    this.items = {}

    // 添加
    Set.prototype.add = (value) => {
        if (this.has(value)) {
            return false
        }
        this.items[value] = value
        return true
    }

    // 移除一个值
    Set.prototype.remove = (value) => {
        if (!this.has(value)) {
            return false
        }
        delete this.items[value]
        return true
    }

    // 移除所有值
    Set.prototype.clear = () => {
        this.items = {}
    }

    // 获取大小
    Set.prototype.size = () => {
        return Object.keys(this.items).length
    }

    // 获取所有的值
    Set.prototype.values = () => {
        return Object.values(this.items)
    }

    // 判断值是否在集合中
    Set.prototype.has = (value) => {
        return this.items.hasOwnProperty(value)
    }

    // 求集合的并集
    Set.prototype.union = (objectSet) => {
        let newSet = new Set()
        let values = Object.keys(this.items)

        for (let i = 0; i < values.length; i++) {
            newSet.add(values[i])
        }

        let values2 = Object.values(objectSet)[0]
        for (let i = 0; i < values2.length; i++) {
            newSet.add(values2[i])
        }

        return newSet
    }

    // 求集合交集
    Set.prototype.intersection = (objectSet) => {
        let newSet = new Set()
        let values = Object.keys(this.items)
        let values2 = Object.keys(objectSet['items'])
        for (let i = 0; i < values.length; i++) {
            if (values2.indexOf(values[i]) !== -1) {
                newSet.add(values[i])
            } 
        }
        return newSet
    }

    // 求集合差集
    Set.prototype.differ = (objectSet) => {
        let newSet = new Set()
        let values = Object.keys(this.items)
        let values2 = Object.keys(objectSet['items'])
        for (let i = 0; i < values.length; i++) {
            if (values2.indexOf(values[i]) === -1) {
                newSet.add(values[i])
            }
        } 
        return newSet
    }

    // 求集合子集
    Set.prototype.son = (objectSet) => {
        let newSet = new Set()
        let values = Object.keys(this.items)
        let values2 = Object.keys(objectSet['items'])
        if (values.length > values2.length) {
            return new Set()
        }
        console.log(values, values2)
        let isSon = true
        for (let i = 0; i < values.length; i++) {
            if (values2.indexOf(values[i]) === -1) {
                isSon = false
            } else {
                newSet.add(values[i])
            }
        }
        if (!isSon) {
            return new Set()
        } else {
            return newSet
        }
    }
}