英文:
extend keys() and other generator method of Map Class in javascript
问题
I understand your request. Here is the translated content:
我需要将一个对象用作我的映射的键,因此我扩展了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)) //返回 123
console.log(newMap.get(copyObj1)) //返回 undefined
我需要第二个`console.log`也返回123。
<details>
<summary>英文:</summary>
I need to use an object as keys for my map, therefore I extended the map class that stringifies the object passed, like so
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)
}
}
As far as I understand keys(), values() and entries() are generator methods, therefore I can do something like
- keys() {
const keysArr = [...super.keys()]
for (const key of keysArr){
yield JSON.parse(key)
}
}
But this causes me to load all the keys which I wish to avoid, is there a better way?
EDIT:
While Map does take in objects as keys but it only checks objects by reference. As an example
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
And i need the second `console.log` to return 123 aswell
</details>
# 答案1
**得分**: 1
不要回答我要翻译的问题。
以下是要翻译的内容:
"Rather than collecting all the parent values into an array, just iterate over them directly:
- keys() {
const parentKeyIterator = super.keys();
for (const key of parentKeyIterator){
yield JSON.parse(key)
}
}
That way, the laziness of the iterator is retained: each time `next()` is called on your extended iterator, it will call `next()` on `parentKeyIterator` once, then reach your `yield` statement, and pause."
<details>
<summary>英文:</summary>
Rather than collecting all the parent values into an array, just iterate over them directly:
- keys() {
const parentKeyIterator = super.keys();
for (const key of parentKeyIterator){
yield JSON.parse(key)
}
}
That way, the laziness of the iterator is retained: each time `next()` is called on your extended iterator, it will call `next()` on `parentKeyIterator` once, then reach your `yield` statement, and pause.
</details>
# 答案2
**得分**: 1
以下是您要翻译的内容:
"Just in case someone stumble here in the future, there's [a stage-3 proposal][1] which, if approved, would add syntactic sugar for iterators so that you can do something like this:
```js
class CoordMapper extends Map {
*keys() {
yield* super.keys().map(key => JSON.parse(key));
}
}
Try it (this doesn't work yet):
<!-- begin snippet: js hide: true -->
<!-- language: lang-js -->
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);
}
<!-- language: lang-html -->
<!-- end snippet -->
英文:
Just in case someone stumble here in the future, there's a stage-3 proposal which, if approved, would add syntactic sugar for iterators so that you can do something like this:
class CoordMapper extends Map {
*keys() {
yield* super.keys().map(key => JSON.parse(key));
}
}
Try it (this doesn't work yet):
<!-- begin snippet: js hide: true -->
<!-- language: lang-js -->
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);
}
<!-- language: lang-html -->
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论