TypeScript、辞書のループ


186

私のコードでは、(ここで提案されているように)Stringインデックスが付けられたいくつかの辞書があります。これはちょっと即興的なタイプなので、各キー(または値、とにかく必要なすべてのキー)をループ処理する方法について何か提案があるかどうか疑問に思っていました。助けてくれてありがとう!

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

試しましたfor (var key in myDictionary) { }か?ループ内ではkey、キーmyDictionary[key]を取得して値を取得するために使用します
Ian

@Ian試してみましたが、動作していないようです。ステートメント内のエラーなし、何も実行されます
ben657

1
@Ian Ah申し訳ありませんが、他のコードがそれをいじっていました。それは完璧に機能します!私がそれを選ぶことができるようにそれを答えにすることに気をつけますか
ben657 2013

回答:


296

キー/値をループするには、for inループを使用します。

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

8
これは一般的に安全ではありません。hasOwnPropertyテスト(Jamie Starkの回答のように)または他の何かが必要です。
ドンハッチ

20
@DonHatchそれは実際には一般的に非常に安全です。非常に特殊なケースでは安全ではありません(プロトタイプを誤って変更するライブラリを含める場合や、意図的にプロトタイプを誤って変更する場合など)。ほとんど不要なチェックでコードを肥大化するかどうかは開発者次第です
Ian

1
@Ian-私の考えでは、事故が発生するのを待っているように見えるので、追加の安全策なしではそれを使用しないと思います。オブジェクトではなく、追加のプロパティを持つもの。はい、あなたが言うように、そのようなシナリオの可能性と重大度を比較検討するのは開発者の責任です。私自身にとって、最も精神的に負担の少ないアプローチは、そのようなシナリオがすべての場合に発生することが保証されているかのように振る舞うことです。
ドンハッチ2016

5
@Ian問題は、オブジェクトのプロトタイプを変更するライブラリが多すぎることです。など、より優れた単純な代替案が存在する場合、このタイプのパターンを推奨することは悪い考えのようObject.keys(target).forEach(key => { let value = target(key); /* Use key, value here */ });です。この方法を示す必要がある場合は、少なくとも、まだよく知らない人のためのリスクとより良い代替案に言及してください。
Yona Appletree

8
すでにes6とTypeScriptがあります。なぜhasOwnPropertyを作成するという問題が常に解決されないのですか?2017年でさえ、JSにすべての注意を払っています。私はとてもがっかりしています。
ガーマン2017

170

<ES 2017

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

> = ES 2017

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

これは、反復の前にキーをソートできるため、私が探していたソリューションです
Andrew

ちなみに、現時点ではTypeScriptプレイグラウンドではサポートされていません。
Seanny123 2017年

1
TypeScriptで動作するようにする方法については、こちらをご覧くださいObject.entries
Alex Klaus

これは完璧です
Piyush Choudhary

67

これはどう?

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

1
tsconfigにlib es2017が必要です。参照してくださいstackoverflow.com/questions/45422573/...
ステファン・

これは、obj [key]のTypescriptエラーを回避するために必要だったものです。 "No index signature ..." objタイプを{[key:string]:string}として明示的に設定し、{[key: string]:any}。これで「値」にアクセスできます。ありがとう
ggedde

無視する場合はkey、空白のままにします[ , value]。(この問題のコメントのおかげで。)
ドミニク

51

Ianが述べたキー/値ループには注意点が1つあります。オブジェクトのプロトタイプに属性が関連付けられている可能性がある場合、in演算子を使用すると、これらの属性が含まれます。したがって、キーがプロトタイプではなくインスタンスの属性であることを確認する必要があります。古いIEはindexof(v)、キーとして表示されることで知られています。

for (const key in myDictionary) {
    if (myDictionary.hasOwnProperty(key)) {
        let value = myDictionary[key];
    }
}

3
ヘアを分割しようとはしていませんが、タイプスクリプトを話しているので、var keyの代わりにletキーを使用すべきではありませんか?いい答えありがとうございます。
ルークデュパン

3
実際、現在のバージョンのタイプスクリプトでは、keyおよびを使用valueできますconst
Patrick Desjardins 2017

hasOwnPropertyターゲットオブジェクトからチェックを呼び出さずに、代わり...if (Object.prototype.hasOwnProperty.call(myDictionary, key))...に次のように実行することをお勧めしno-prototype-builtinsます。そうでない場合、ルールでeslintを使用している場合、エラーが発生します。
受信

6

すべてのディクショナリ/オブジェクト値を取得する最短の方法:

Object.keys(dict).map(k => dict[k]);

1

キーを取得するには:

function GetDictionaryKeysAsArray(dict: {[key: string]: string;}): string[] {
  let result: string[] = [];
  Object.keys(dict).map((key) =>
    result.push(key),
  );
  return result;
}

1

Ians Answerは適切ですが、更新されないため、キーにはletではなくconstを使用する必要があります。

for (const key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.