suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Erweitern Sie „keys()“ und andere Generatormethoden der Map-Klasse in Javascript

Ich musste ein Objekt als Schlüssel für meine Karte verwenden, also habe ich die Kartenklasse erweitert, die das übergebene Objekt wie unten gezeigt stringisiert

class CoordMapper extends Map {
    set = (k: ISquareCoordinate, v: Array<ISquareCoordinate>) => {
        const stringifiedKey = JSON.stringify(k)
        return super.set(stringifiedKey,v)
    }

    get = (k: ISquareCoordinate) => {
        const stringifiedKey = JSON.stringify(k)
        return super.get(stringifiedKey)
    }
}

Soweit ich weiß, sind „keys()“, „values()“ und „entrys()“ Generatormethoden, sodass ich etwas Ähnliches tun kann

* keys() {
   const keysArr = [...super.keys()]
   for (const key of keysArr){
      yield JSON.parse(key)
   }
}

Aber das führt dazu, dass ich alle Schlüssel lade, die ich vermeiden möchte. Gibt es einen besseren Weg?

Bearbeiten: Während Map Objekte als Schlüssel hat, prüft es Objekte nur anhand ihrer Referenz. Geben Sie ein Beispiel

let newMap = Map()
const obj1 = {'a': 1, 'b' :2}
newMap.set(obj1, 123)
const copyObj1 = {...obj1}
console.log(newMap.get(obj1)) //returns 123
console.log(newMap.get(copyObj1)) //returns undefined

Ich brauche ein zweites console.log Zurück zu 123

P粉613735289P粉613735289293 Tage vor472

Antworte allen(2)Ich werde antworten

  • P粉211273535

    P粉2112735352024-02-04 21:25:11

    为了防止将来有人在这里绊倒,有一个第三阶段提案 如果获得批准,将为迭代器添加语法糖,以便您可以执行如下操作:

    class CoordMapper extends Map {
      *keys() {
        yield* super.keys().map(key => JSON.parse(key));
      }
    }
    

    尝试一下(这还不起作用):

    console.config({ maximize: true });
    
    class CoordMapper extends Map {
      set(k, v) {
        return super.set(JSON.stringify(k), v)
      }
      get(k) {
        return super.get(JSON.stringify(k));
      }
      *keys() {
        console.log(super.keys())
        yield* super.keys().map(JSON.parse);
      }
    }
    
    const c = new CoordMapper();
    
    c.set({ foo: 'bar' }, 0);
    c.set({ baz: 42 }, 1);
    c.set({ qux: { lorem: 'ipsum' } }, [null, undefined]);
    
    for (const key of c.keys()) {
      console.log(key);
    }

    Antwort
    0
  • P粉311089279

    P粉3110892792024-02-04 00:20:53

    无需将所有父值收集到数组中,而是直接迭代它们:

    * keys() {
       const parentKeyIterator = super.keys();
       for (const key of parentKeyIterator){
          yield JSON.parse(key)
       }
    }

    这样,迭代器的惰性就被保留了:每次在扩展迭代器上调用 next() 时,它都会在 parentKeyIterator 上调用 next() 一次,然后到达 yield 语句,然后暂停。

    Antwort
    0
  • StornierenAntwort