Zac*_*ose 9 javascript typescript
在我的代码中点击这个奇怪的错误,当使用元组作为我的密钥时,我无法想象从地图中获得恒定时间查找的方法.
希望这说明了这个问题,我现在正在使用的解决方法就是让它工作:
hello.ts:
let map: Map<[number, number], number> = new Map<[number, number], number>()
.set([0, 0], 48);
console.log(map.get([0,0])); // prints undefined
console.log(map.get(String([0, 0]))); // compiler: error TS2345: Argument of type
// 'string' is not assignable to parameter of type '[number, number]'.
//the work-around:
map.forEach((value: number, key: [number, number]) => {
if(String(key) === String([0, 0])){
console.log(value); // prints 48
}
})
Run Code Online (Sandbox Code Playgroud)
要编译(transpile?)我正在使用:
tsc hello.ts -target es6
Run Code Online (Sandbox Code Playgroud)
tsc版本2.1.6
尝试了几件事来使Map.get()方法起作用,但没有取得多大成功.
Frx*_*rem 14
在JavaScript(以及作为扩展,TypeScript)中,没有两个数组是相等的,除非它们引用相同的数组(即,当更改一个元素也会改变另一个元素时).如果使用相同的元素创建新数组,则不会认为它等于任何现有数组.
由于Maps在查找元素时会考虑这种相等性,因此如果将数组存储为键作为键,则只有再次传入与键完全相同的数组引用时,才能再次获取该值:
const map: Map<[ number, number], number> = new Map<[ number, number ], number>();
const a: [ number, number ] = [ 0, 0 ];
const b: [ number, number ] = [ 0, 0 ];
// a and b have the same value, but refer to different arrays so are not equal
a === b; // = false
map.set(a, 123);
map.get(a); // = 123
map.get(b); // = undefined
Run Code Online (Sandbox Code Playgroud)
一个简单的解决方法是使用字符串或数字作为键,因为它们具有相同的值时始终被视为相等:
const map: Map<string, number> = new Map<string, number>();
const a: [ number, number ] = [ 0, 0 ];
const b: [ number, number ] = [ 0, 0 ];
const astr: string = a.join(','); // = '0,0'
const bstr: string = b.join(','); // = '0,0'
// astr and bstr have the same value, and are strings so they are always equal
astr === bstr; // = true
map.set(astr, 123);
map.get(astr); // = 123
map.get(bstr); // = 123
Run Code Online (Sandbox Code Playgroud)
我会创建自己的类来执行此操作,以便我可以轻松使用所有地图方法:
class MyMap {
private map = new Map<string, number>();
set(key: [number, number], value: number): this {
this.map.set(JSON.stringify(key), value);
return this;
}
get(key: [number, number]): number | undefined {
return this.map.get(JSON.stringify(key));
}
clear() {
this.map.clear();
}
delete(key: [number, number]): boolean {
return this.map.delete(JSON.stringify(key));
}
has(key: [number, number]): boolean {
return this.map.has(JSON.stringify(key));
}
get size() {
return this.map.size;
}
forEach(callbackfn: (value: number, key: [number, number], map: Map<[number, number], number>) => void, thisArg?: any): void {
this.map.forEach((value, key) => {
callbackfn.call(thisArg, value, JSON.parse(key), this);
});
}
}
Run Code Online (Sandbox Code Playgroud)
(操场上的代码)
如您所见,该forEach示例将自动为您提供密钥,[number, number]而不是您随后需要解析的字符串。
用法示例:
let map = new MyMap();
map.set([1, 2], 4);
console.log(map.get([1, 2])) // 4
map.set([3, 4], 20);
map.forEach((v, k) => console.log(k, v));
// prints:
// [1, 2] 4
// [3, 4] 20
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5714 次 |
| 最近记录: |