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
为了防止将来有人在这里绊倒,有一个第三阶段提案 如果获得批准,将为迭代器添加语法糖,以便您可以执行如下操作:
尝试一下(这还不起作用):
无需将所有父值收集到数组中,而是直接迭代它们:
这样,迭代器的惰性就被保留了:每次在扩展迭代器上调用
next()
时,它都会在parentKeyIterator
上调用next()
一次,然后到达yield
语句,然后暂停。