【问题标题】:How to design and implement ES6 Set without calling the API new Set()如何在不调用 API new Set() 的情况下设计和实现 ES6 Set
【发布时间】:2018-06-02 23:24:48
【问题描述】:

有人问我如何在 javascript 中实现 Set,特别是如何设计一个模拟 ES6 中的 Set 的类。底层数据结构应该是什么?

【问题讨论】:

  • @JaromandaX 我认为是一个数组,因为键需要是任意类型,而不仅仅是字符串。当然,对象可以包含键作为我猜的属性值(如数组)
  • 你尝试了什么?没有太多选择可以使用
  • 对 *javascript Set polyfill' 的简单搜索会出现多个结果,包括 github.com/jfriend00/ES6-Setgithub.com/paulmillr/es6-shim
  • 这个问题是不是没有使用Set 的实例?因为那样通过使用 Map 而只是忽略值来实现是微不足道的。

标签: javascript ecmascript-6 set


【解决方案1】:

最简单的方法是使用Map:

class Set {
    constructor(items) {
        this._map = new Map(Array.from(items, [v, true]));
    }

    get size() { 
        return this._map.size;
    }

    has(v) {
        this._map.has(v);
    }
    add(v) {
        this._map.set(v, true);
    }
    delete(v) {
        this._map.delete(v);
    }
    clear() {
        this._map.clear();
    }

    *entries() {
        for (const k of this._map.keys()) {
            yield [k, k];
        }
    }

    keys() {
        return this._map.keys();
    }
    values() {
        return this._map.keys();
    }
    forEach(cb, context) {
        for (const k of this._map.keys()) {
            cb.apply(context, k, k);
        }
    }

    [Symbol.iterator]() {
        return this.values();
    }
}

【讨论】:

猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 2019-06-05
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 2016-02-10
相关资源
最近更新 更多