搜尋

首頁  >  問答  >  主體

javascript中擴充keys()和Map類別的其他生成器方法

我需要使用一個物件作為我的地圖的鍵,因此我擴展了將傳遞的物件字串化的地圖類,如下所示

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

P粉613735289P粉613735289340 天前496

全部回覆(2)我來回復

  • 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);
    }
    sssccc

    回覆
    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 語句,然後暫停。

    回覆
    0
  • 取消回覆