2017-02-13 90 views
17

我剛剛使用TypeScript,並試圖實現一個hashmap/dictionary接口。到目前爲止,我有TypeScript散列表/字典接口

export interface IHash { 
    [details: string] : string; 
} 

我在理解這個語法究竟意味着什麼有些麻煩。如果我要這樣做var x : IHash = {};我將如何去添加/訪問數據?

回答

32

就像一個正常的JS對象:

let myhash: IHash = {}; 

myhash["somestring"] = "value"; //set 

let value = myhash["somestring"]; //get 

有你與[indexer: string] : string

  • 告訴打字稿做兩件事情,對象可以是任何基於字符串鍵
  • 那一個鍵的值,除非明確鍵入,否則應該是字符串值。

enter image description here

作爲替代,有一個Map類:

let map = new Map<string, string>(); 

map.set("key", "value"); 
map.get("key"); // value 

這可以讓你有任何對象(而不僅僅是數量/串)爲重點。

雖然它比較新,所以如果您定位舊系統,您可能需要對其進行填充。

2
var x : IHash = {}; 
x['key1'] = 'value1'; 
x['key2'] = 'value2'; 

console.log(x['key1']); 
// outputs value1 

console.log(x['key2']); 
// outputs value2 

如果你想通過你的字典迭代,你可以使用。

Object.keys(x).forEach((key) => {console.log(x[key])}); 

Object.keys返回一個對象的所有屬性,所以它很適合返回字典樣式對象中的所有值。

你也提到了你的問題中的散列表,上面的定義是針對字典樣式的界面。因此,這些鍵將是唯一的,但值不會。

只需將相同的值分配給密鑰及其值,就可以像使用哈希集合一樣使用它。

如果您希望密鑰具有唯一性並且可能具有不同的值,那麼您只需在添加對象之前檢查對象是否存在。

var valueToAdd = 'one'; 
if(!x[valueToAdd]) 
    x[valueToAdd] = valueToAdd; 

或者你可以建立你自己的類來充當各種哈希集。

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(); 
    } 
} 
+1

在Stack Overflow上添加關於您的解決方案應該工作原因的解釋是很好的做法。有關更多信息,請閱讀[如何回答](// stackoverflow.com/help/how-to-answer)。 –