Erweitern Sie „keys()' und andere Generatormethoden der Map-Klasse in Javascript
P粉613735289
P粉613735289 2024-02-04 00:24:18
0
2
470

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粉613735289
P粉613735289

Antworte allen(2)
P粉211273535

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

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);
}
P粉311089279

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

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

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

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage