用javascript实现Set

74 阅读1分钟

实现SetIterator

class _SetIterator {
    constructor(value) {
        this._start = 0;
        this["[[Entries]]"] = value;
    }
    next() {
        const maxLen = Object.keys(this["[[Entries]]"]).length;
        if (this._start < maxLen) {
            return { value: this["[[Entries]]"][this._start++], done: false }
        }
        return { value: undefined, done: true }
    }
}

实现Set

class _Set {
    constructor(payload) {
        const it = payload ? payload[Symbol.iterator]() : null;
        let entries = Object.create(null);
        let res = Object.create(null);
        if (it) {
            let t = it.next(), i = 0;
            while(!t.done) {
                if (!res[t.value]) {
                    let entry = Object.create(null);
                    entry.value = t.value;
                    entries[i++] = entry;
                    res[t.value] = true;
                }
                t = it.next();
            }
        }
        this["[[Entries]]"] = entries;
    }
    get size() {
        return Object.keys(this["[[Entries]]"]).length;
    }
    add(value) {
        if (!this.has(value)) {
            this["[[Entries]]"][this.size] = value;
        }
        return this;
    }
    clear() {
        this["[[Entries]]"] = Object.create(null);
    }
    delete(value) {
        const fItem = Object.entries(this["[[Entries]]"]).find(arr => arr[1] === value);
        if (fItem) {
            return delete this["[[Entries]]"][fItem[0]];
        }
        return false;
    }
    values() {
        return new _SetIterator(this["[[Entries]]"]);
    }
    keys() {
        return this.values()
    }
    entries() {
        let start = 0;
        return {
            next() {
                if (start++ < this.size) {
                    const v = this["[[Entries]]"][start].value;
                    return { value: [v, v], done: false }
                }
                return { value: undefined, done: true }
            }
        }
    }
    forEach(callback) {
        Object.values(this["[[Entries]]"]).forEach(v => { callback(v, v, this) });
    }
    has(value) {
        return Object.values(this["[[Entries]]"]).includes(value);
    }
    [Symbol.iterator]() {
        return new _SetIterator(this["[[Entries]]"]);
    }
}

测试效果图如下:

image.png