我需要使用一個物件作為我的地圖的鍵,因此我擴展了將傳遞的物件字串化的地圖類,如下所示
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) } }
據我了解keys()、values()和entries()是生成器方法,因此我可以做類似的事情
* keys() { const keysArr = [...super.keys()] for (const key of keysArr){ yield JSON.parse(key) } }
但這會導致我加載所有我希望避免的鍵,有更好的方法嗎?
編輯: 雖然 Map 確實將物件作為鍵,但它僅透過引用檢查物件。舉個例子
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
我還需要第二個 console.log
回傳 123
為了防止將來有人在這裡絆倒,有一個第三階段提案 如果獲得批准,將為迭代器添加語法糖,以便您可以執行如下操作:
嘗試(這還不起作用):
無需將所有父值收集到陣列中,而是直接迭代它們:
這樣,迭代器的惰性就被保留了:每次在擴充迭代器上呼叫
next()
時,它都會在parentKeyIterator
上呼叫next( )
一次,然後到達yield
語句,然後暫停。