2017-02-13 7 views
17

私はTypeScriptを初めて使用しています。ハッシュマップ/辞書インターフェイスを実装しようとしています。これまでのところ私は持っていますTypeScript hashmap/dictionary interface

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

  • でやっている2つありますオブジェクトは、任意の文字列ベースのキー
  • それを持つことができるという活字体に伝えます明示的に型指定されない限り、キーの値は文字列値でなければなりません。代替案として

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

ソリューションがうまくいかなければならない理由についての説明を追加することは、スタックオーバーフローの良い習慣です。詳細については、[How To Answer](// stackoverflow.com/help/how-to-answer)を参照してください。 –