我需要使用一个对象作为我的地图的键,因此我扩展了将传递的对象字符串化的地图类,如下所示
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
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
为了防止将来有人在这里绊倒,有一个第三阶段提案 如果获得批准,将为迭代器添加语法糖,以便您可以执行如下操作:
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); }无需将所有父值收集到数组中,而是直接迭代它们:
* keys() { const parentKeyIterator = super.keys(); for (const key of parentKeyIterator){ yield JSON.parse(key) } }这样,迭代器的惰性就被保留了:每次在扩展迭代器上调用
next()时,它都会在parentKeyIterator上调用next()一次,然后到达yield语句,然后暂停。