我是使用TypeScript的新手,我正在尝试实现一个hashmap/dictionary接口.到目前为止我有
export interface IHash {
[details: string] : string;
}
Run Code Online (Sandbox Code Playgroud)
我在理解这种语法的含义时遇到了一些麻烦.如果我要做var x : IHash = {};,我将如何添加/访问数据?
Mei*_*hes 96
就像一个普通的js对象一样:
let myhash: IHash = {};
myhash["somestring"] = "value"; //set
let value = myhash["somestring"]; //get
Run Code Online (Sandbox Code Playgroud)
你正在做两件事 [indexer: string] : string
您可以使用显式类型字段创建通用字典 [key: string]: any;
例如age必须是number,虽然name必须是一个字符串 - 两者都是必需的.任何隐含字段都可以是任何类型的值.
作为替代方案,有一个Map类:
let map = new Map<object, string>();
let key = new Object();
map.set(key, "value");
map.get(key); // return "value"
Run Code Online (Sandbox Code Playgroud)
这允许您将任何Object 实例(不仅仅是数字/字符串)作为键.
虽然它相对较新,但如果您定位旧系统,则可能需要对其进行填充.
aWe*_*per 29
最简单正确的方法是使用Record 类型 Record<string, string>
const myVar : Record<string, string> = {
key1: 'val1',
key2: 'val2',
}
Run Code Online (Sandbox Code Playgroud)
var x : IHash = {};
x['key1'] = 'value1';
x['key2'] = 'value2';
console.log(x['key1']);
// outputs value1
console.log(x['key2']);
// outputs value2
Run Code Online (Sandbox Code Playgroud)
如果您想迭代字典,可以使用.
Object.keys(x).forEach((key) => {console.log(x[key])});
Run Code Online (Sandbox Code Playgroud)
Object.keys返回对象的所有属性,因此它可以很好地返回字典样式对象中的所有值.
您还在问题中提到了一个hashmap,上面的定义是针对字典样式的接口.因此,键将是唯一的,但值不会.
您只需将相同的值分配给键及其值即可将其用作哈希集.
如果您希望密钥是唯一的并且具有可能不同的值,那么您只需要在添加密钥之前检查对象上是否存在密钥.
var valueToAdd = 'one';
if(!x[valueToAdd])
x[valueToAdd] = valueToAdd;
Run Code Online (Sandbox Code Playgroud)
或者您可以构建自己的类来充当各种类型的哈希集.
Class HashSet{
private var keys: IHash = {};
private var values: string[] = [];
public Add(key: string){
if(!keys[key]){
values.push(key);
keys[key] = key;
}
}
public GetValues(){
// slicing the array will return it by value so users cannot accidentally
// start playing around with your array
return values.slice();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
106587 次 |
| 最近记录: |