JavaScriptで(キー、値)を反復する方法は?


335

次の形式の辞書があります

dictionary = {0: {object}, 1:{object}, 2:{object}}

次のようなことをして、この辞書をどのように反復できますか

for((key,value) in dictionary){
  //Do stuff where key would be 0 and value would be the object
}

3
for (let [key, value] of Object.entries(obj))、バベルが必要です。
elclanrs


1
@elclanrs ES2016におけるその、それはまだ標準化されていない:-)
thefourtheye


@dooagain、それはこの質問の配列ではありません。
zangw 2016年

回答:


479

tl; dr

  1. ECMAScript 5では不可能です。
  2. ECMAScript 2015では、Maps で可能です。
  3. ECMAScript 2017では、すぐに利用できます。

ECMAScript 5:

いいえ、オブジェクトでは不可能です。

このようにfor..in、またはObject.keysで反復する必要があります

for (var key in dictionary) {
    // check if the property/key is defined in the object itself, not in parent
    if (dictionary.hasOwnProperty(key)) {           
        console.log(key, dictionary[key]);
    }
}

注:上記のif条件は、dictionaryオブジェクト自体のプロパティを反復処理する場合にのみ必要です。そのためfor..in、すべての継承された列挙のプロパティを繰り返し処理します。

または

Object.keys(dictionary).forEach(function(key) {
    console.log(key, dictionary[key]);
});

ECMAScript 2015

ECMAScript 2015では、Mapオブジェクトを使用して、でオブジェクトを反復できますMap.prototype.entries。そのページの引用例、

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

var mapIter = myMap.entries();

console.log(mapIter.next().value); // ["0", "foo"]
console.log(mapIter.next().value); // [1, "bar"]
console.log(mapIter.next().value); // [Object, "baz"]

またはfor..of、次のように繰り返します

'use strict';

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

for (const entry of myMap.entries()) {
  console.log(entry);
}

出力

[ '0', 'foo' ]
[ 1, 'bar' ]
[ {}, 'baz' ]

または

for (const [key, value] of myMap.entries()) {
  console.log(key, value);
}

出力

0 foo
1 bar
{} baz

ECMAScript 2017

ECMAScript 2017は新しい関数を導入しますObject.entries。これを使用して、必要に応じてオブジェクトを反復できます。

'use strict';

const object = {'a': 1, 'b': 2, 'c' : 3};
for (const [key, value] of Object.entries(object)) {
  console.log(key, value);
}

出力

a 1
b 2
c 3

1
ここでの基本的な疑問。サーバー側のjavascriptであるnode.jsでこれを行う方法を探してここに着陸しました。私の場合、どのESバージョンが適用されるかをどうやって知るのですか また、通常のJavaScriptユーザーの場合、ESのバージョンはクライアントのブラウザーに依存することを理解しているので、サポートする適切な方法は何ですか?
Sandeepan Nath

2
あなたが好きなウェブサイトを使用することができます@SandeepanNath node.green知るために、特定のESの機能は、お使いのNode.js.でサポートされている場合 ブラウザに関する限り、人々は一般に広くサポートされているバージョン、この場合はES5をターゲットにします。これとは別に、トランスベイラー(Babelなど)はES2015 +コードをES5に変換するのに役立ちます。
thefourtheye

1
私はObject.keys(dictionary).forEach(function(key) {…とても読みやすく、互換性があります。
ctrl-alt-delor 2018

5
Object.entries(object).forEach(([key, val]) => {...});
クリムゾン、


60

これを試して:

dict = {0:{1:'a'}, 1:{2:'b'}, 2:{3:'c'}}
for (var key in dict){
  console.log( key, dict[key] );
}

0 Object { 1="a"}
1 Object { 2="b"}
2 Object { 3="c"}

42

このObject.entries()メソッドはES2017で指定されています(すべての最新ブラウザーでサポートされています):

for (const [ key, value ] of Object.entries(dictionary)) {
    // do something with `key` and `value`
}

説明:

  • Object.entries()のようなオブジェクトを受け取り、{ a: 1, b: 2, c: 3 }それをキーと値のペアの配列に変換します[ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]

  • for ... of作成した配列のエントリをループできます。

  • 我々がされているので保証ので、反復配列の各項目は、2つのエントリアレイ自体であることを、我々が使用することができる構造化代入直接割り当て変数へkeyvalueその最初と2番目の項目です。


悲しいことに、人々はまだInternet Explorerを使用しています
Edward

私は痛々しいほど気づいています。Babelとpolyfill.ioはこれを解決しますが、決して楽しいものではありません。
Loilo

19

あなたはこのようなことをすることができます:

dictionary = {'ab': {object}, 'cd':{object}, 'ef':{object}}
var keys = Object.keys(dictionary);

for(var i = 0; i < keys.length;i++){
   //keys[i] for key
   //dictionary[keys[i]] for the value
}

3
綺麗な!ECMAscript 5であなたの答えがどのように機能するのかが好きです。受け入れられ、最も支持されている答えは不可能だと言っていますが。あなたはもっと多くの賛成投票に値します。
liljoshu

18

これを試して:

var value;
for (var key in dictionary) {
    value = dictionary[key];
    // your code here...
}

9

2020へようこそ* ES6での失敗*

ここにはかなり古い答えがいくつかあります-解体を利用してください。私の意見では、これは間違いなくオブジェクトを反復する最も良い(非常に読みやすい)方法です。

Object.entries(myObject).forEach(([k,v]) => {
    console.log("The key: ",k)
    console.log("The value: ",v)
})

注:上記で置き換えるforEachmap、値を集計することができます。map次に、上記の値のリストを返すため、他の方法でコードが単純化される可能性があります。
Lazerbeak12345


1

swagger-ui.jsの使用

あなたはこれを行うことができます -

_.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
    console.log(n, key);
 });

0

以下のスクリプトを使用できます。

var obj={1:"a",2:"b",c:"3"};
for (var x=Object.keys(obj),i=0;i<x.length,key=x[i],value=obj[key];i++){
    console.log(key,value);
}

出力
1 a
2 b
c 3


#will #c 3#1 a#2 b
Michael Piper

4
答えに説明を追加することを検討してください。コードだけではあまり役に立ちません。また、あなたはあなたの答えを編集することができます、コメントはあなたがそれらを使用している方法での答えへの拡張であることを意味しません
Viktor

0

受け入れられた回答の改善として、ネストを減らすために、キーが継承されない限り、代わりにこれを行うことができます。

for (var key in dictionary) {
    if (!dictionary.hasOwnProperty(key)) {
        continue;
    }
    console.log(key, dictionary[key]);
}

編集:ここに関する情報Object.hasOwnProperty

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