連想配列キーのリストを取得する


258

私はJavaScriptで連想配列を持っています:

var dictionary = {
    "cats": [1,2,3,4,5], 
    "dogs": [6,7,8,9,10]
};

この辞書のキーを取得するにはどうすればよいですか?つまり私は欲しい

var keys = ["cats", "dogs"];

7年後の編集:用語を正しくobject理解するために-JavaScriptには「連想配列」などはありません-これは技術的には単なるものであり、必要なオブジェクトキーです。


lodash JSを使用した簡単な方法-lodash.com/docs#keys
ケミカルプログラマー

用語を明確にしていただきありがとうございます。真っ赤に点滅するライトでそれをもう少し大きくできますか?
ジョーフィリップス

@Joe機会があったら、Googleで最初の結果にします
Simon_Weaver

回答:


84

以下を使用できます。 Object.keys(obj)

例:

var dictionary = {
  "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
  "dogs": [4, 5, 6, 3, 2]
};

// Get the keys
var keys = Object.keys(dictionary);

console.log(keys);

ブラウザのサポートについては、以下のリファレンスを参照してください。Firefox 4.20、Chrome 5、IE9でサポートされています。以下のリンクには、Object.keys()ブラウザーでサポートされていない場合に追加できるコードスニペットが含まれています。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys


これを承認済みの回答に切り替えています。唯一のIE8は(そのためポリフィルが使用可能なもうそれをサポートしていませんdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Simon_Weaver

382

これを試して:

var keys = [];
for (var key in dictionary) {
  if (dictionary.hasOwnProperty(key)) {
    keys.push(key);
  }
}

hasOwnPropertyのプロトタイプオブジェクトにキーを挿入することが可能なためですdictionary。ただし、通常はこれらのキーをリストに含めたくありません。

たとえば、次のようにした場合:

Object.prototype.c = 3;
var dictionary = {a: 1, b: 2};

その後、やるfor...in以上のループをdictionary、あなたが買ってあげるab、あなたも取得しますc


ループの後で使用する必要がない限り、「var keys = []」を宣言する必要はありません。
mzalazar 2014

2
@mzalazar、そうするか、グローバル変数にしてください。これは悪い習慣です。
b00t 2016年

@ b00t私はそれをforループ内で変数を宣言することによって...それはグローバル空間では設定されません...今あなたは私にheheを疑わせました:)
mzalazar

2
@mzalazar、しかし単にを使用している場合は、どの時点でもそれ(キー)を宣言していませんkeys.push(key);。あなたは単にグローバルな名前空間から引っ張っている(そしてそれを宣言している)だけです。:)
b00t 2016年

183
for (var key in dictionary) {
  // do something with key
}

これはfor..inステートメントです。


1
「dogs」と上記の配列の間にコンマの代わりにコロンがあることに気づいたばかりです。それは転写によると仮定します。
ウォンブルトン2009

68
非常に重要かどうかを確認するためにdictionary.hasOwnProperty(key)そうしないと、プロトタイプチェーンからの方法で終わる可能性があり...
Tigraine

4
同じ記事から:オブジェクトの列挙可能なプロパティを任意の順序で反復します。キーの順序が重要な場合は、配列にそれらをプッシュし、並べ替えてから、for()ループを使用して、元のオブジェクトにインデックスを付けるために並べ替えられた配列からキーを取得するなどの操作を行う必要があります。
mcmlxxxvi 2013

1
もちろん、オブジェクトにプロトタイプがないことを確信できる場合は、dictionary.hasOwnPropertyチェックを省略して最適化するのは公平です。ただし、JavaScript辞書は実際にはオブジェクトであるため、このコンテキストでのプロトタイプ継承の可能性に注意することが重要です。
Fixermark 2015

16

ライブラリ(jQuery、プロトタイプなど)を使用する場合は、for..inの使用に注意してください。それらのほとんどは、作成されたオブジェクト(ディクショナリを含む)にメソッドを追加するためです。

つまり、それらをループすると、メソッド名がキーとして表示されます。ライブラリを使用している場合は、ドキュメントを参照し、列挙可能なセクションを探してください。ここには、オブジェクトの反復に適したメソッドが見つかります。


3

シンプルなJQUERY方法。

これは私が使用し
たいものであり、DictionaryObjを通過したいJavaScript辞書オブジェクトです。値、もちろんキーは辞書内のそれらの名前です。

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });

1
これにはjQuery(これは問題ありません)が必要ですが、言及するのを忘れていました:-)
Simon_Weaver

@Exzile関数定義の引数名は非常に混乱します。api.jquery.com/jquery.eachで、コールバックはFunction(String propertyName、Object valueOfProperty)であると述べています。あなたの名前は逆を意味します。
Chris

@Chris更新します。ご指摘いただきありがとうございます。
Exzile、

0

私は現在、Rob de la Cruzの返信を使用しています

Object.keys(obj)

そして、早い段階で読み込まれたファイルには、Object.keysが組み込まれていない古いバージョンのスクリプトインタープリターのケースをカバーする、インターネットの他の場所から借りたコード行がいくつかあります。

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

これは、大規模プロジェクトの両方の世界で最も優れていると思います。シンプルな最新コードと、古いバージョンのブラウザーの下位互換性サポートなどです。

実際には、Rob de la CruzのObject.keys(obj)がネイティブで利用できない場合に、JWのソリューションを関数に組み込みます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.