javascript中扩展keys()和Map类的其他生成器方法
P粉613735289
P粉613735289 2024-02-04 00:24:18
[JavaScript讨论组]

我需要使用一个对象作为我的地图的键,因此我扩展了将传递的对象字符串化的地图类,如下所示

class CoordMapper extends Map {
    set = (k: ISquareCoordinate, v: Array) => {
        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粉613735289
P粉613735289

全部回复(1)
P粉311089279

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

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号