2013-04-23 10 views
75

私のコードでは、(hereとして示唆されている)いくつかの辞書がインデックスされています。これは即興型のビットなので、どのように各キー(または値、私はとにかくキーが必要)をループすることができるかについての提案があるかどうか疑問に思っていました。どんな助けにも感謝!TypeScript、辞書をループする

myDictionary: { [index: string]: any; } = {}; 
+0

次のようにしてください: 'for(myDictionary内のvarキー){}'?ループ内でキーを取得するには 'key'を使用し、値を取得するには' myDictionary [key] 'を使用します – Ian

+0

@Ianちょうどそれを試みましたが、動作していないようです。エラーはありませんが、文内では何も実行されません – ben657

+1

@Ian Ah申し訳ありませんが、他のコードではそれを乱していました。それは完璧に動作します!私はそれを選ぶことができるようにそれを答えにするためのケア? – ben657

答えて

117

は、キー/値をループする際、for inループを使用します。イアンが言及したことを、キー/値のループに1つの警告があり

for (let key in myDictionary) { 
    let value = myDictionary[key]; 
    // Use `key` and `value` 
} 
+0

"key"を変数名として使用する必要がありますか? – Yiping

+2

@ Yipingいいえ、それは私のために明確にするのに役立ちます – Ian

+2

これは一般的には安全ではありません。それは、hasOwnPropertyテスト(Jamie Starkの回答のように)または何か他のものが必要です。 –

33

。 ObjectがPrototypeにアタッチされた属性を持つ可能性があり、in演算子を使用すると、これらの属性が含まれます。したがって、キーがプロトタイプではなくインスタンスの属性であることを確認する必要があります。以前のIEは、indexof(v)をキーとして表示することで知られています。

for (var key in myDictionary) { 
    if (myDictionary.hasOwnProperty(key)) { 
     var value = myDictionary[key]; 
    } 
} 
+2

髪を分割しようとしていませんが、タイプスクリプトを話しているので、varキーの代わりにletキーを使うべきではありませんか?ニースの答えはありがとう。 –

+1

実際、現在のバージョンのスクリプトでは、 'key'と' value'は 'const'です。 –

41

@Alcesemは、ほぼ右その方法の利点は、イテレータがプロトタイプチェーンまで、さらに検索しませんので、1がObject.keyshasOwnProperty()ガードを含める必要がないことであることを除いて、それを持っていました。したがって、以下は辞書に対して安全であるだけでなく、TypescriptとJavascriptの両方でオブジェクトの種類は安全です。 2017

< ES:

Object.keys(obj).forEach(key => { let value = obj[key]; }); 

> = ES 2017

Object.entries(obj).forEach(
    ([key, value]) => console.log(key, value) 
); 
+0

これは、私が繰り返しの前に鍵をソートできるようにするための解決策です – Andrew

+0

FYI、これは現時点でTypeScriptのプレイグラウンドではサポートされていません。 – Seanny123

+1

TypeScriptで 'Object.entries'を動作させる方法については、こちら[http://tackoverflow.com/a/39815452/968003]を参照してください。 –

8

これはどう?

for (let [key, value] of Object.entries(obj)) { 
    ... 
}