用javascript实现Map

47 阅读1分钟

实现MapIterator

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

实现Map

class _Map {
    constructor(payload) {
        const it = payload ? payload[Symbol.iterator]() : null;
        let entries = Object.create(null);
        let res = [];
        if (it) {
            let t = it.next(), i = 0;
            while(!t.done) {
                const fIndex = res.indexOf(t.value[0]);
                if (fIndex > -1) {
                    entries[fIndex].value = t.value[1];
                } else {
                    res.push(t.value[0]);
                    entries[i++] = { key: t.value[0], value: t.value[1] };
                }
                t = it.next();
            }
        }
        this["[[Entries]]"] = entries;
    }
    get size() {
        return Object.keys(this["[[Entries]]"]).length;
    }
    get(key) {
        const it = this[Symbol.iterator]();
        let t = it.next();
        while(!t.done) {
            if (t.value[0] === key) return t.value[1];
            t = it.next();
        }
        return;
    }
    set(key, value) {
        const it = this[Symbol.iterator]();
        let t = it.next();
        let i = 0;
        while(!t.done) {
            if (t.value[0] === key) {
                break;
            }
            t = it.next();
            i++;
        }
        this["[[Entries]]"][i] = { key, value };
        return this;
    }
    clear() {
        this["[[Entries]]"] = Object.create(null);
    }
    delete(key) {
        const fItem = Object.entries(this["[[Entries]]"]).find(arr => arr[1].key === key);
        if (fItem) {
            return delete this["[[Entries]]"][fItem[0]];
        }
        return false;
    }
    values() {
        let start = 0;
        return {
            next() {
                if (start++ < this.size) {
                    const value = this["[[Entries]]"][start].value;
                    return { value, done: false }
                }
                return { value: undefined, done: true }
            }
        }
    }
    keys() {
        let start = 0;
        return {
            next() {
                if (start++ < this.size) {
                    const value = this["[[Entries]]"][start].key;
                    return { value, done: false }
                }
                return { value: undefined, done: true }
            }
        }
    }
    entries() {
        return new _MapIterator(this["[[Entries]]"]);
    }
    forEach(callback) {
        Object.values(this["[[Entries]]"]).forEach(v => { callback(v.value, v.key, this) });
    }
    has(key) {
        return Object.values(this["[[Entries]]"]).some(v => v.key === key);
    }
    [Symbol.iterator]() {
        return new _MapIterator(this["[[Entries]]"]);
    }
}

测试效果图如下:

image.png