JavaScriptのFor..Inループ-キーと値のペア


414

foreachJavaScriptでPHP ループのようなことをする方法があるかどうか疑問に思っていました。私が探している機能は、このPHPスニペットのようなものです。

foreach($data as $key => $value) { }

JS for..inループを見ていましたが、を指定する方法がないようasです。これを「通常」のforループ(for(var i = 0; i < data.length; i++)で行う場合、キー=>値のペアを取得する方法はありますか?

回答:


216

ES6をネイティブで使用できる場合、またはBabel(jsコンパイラ)で使用できる場合は、次のことを実行できます。

const test = {a: 1, b: 2, c: 3};

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

これはこの出力を印刷します:

a 1
b 2
c 3

このObject.entries()メソッドは、ループ[key, value]によって提供されるのと同じ順序で、指定されたオブジェクト自体の列挙可能なプロパティペアの配列を返しfor...inます(違いは、for-inループがプロトタイプチェーンのプロパティも列挙することです

それが役に立てば幸い!=)


1
これは完璧に機能し、不思議に思います。「オブジェクト内のキーの場合、オブジェクト[キー]で値を取得する」と比較して、どちらが優れたパフォーマンスを発揮しますか?
lsheng 2017

1
この特定のケースでは、Object.entries呼び出しのために遅くなると思います。ただし、テストは実行しませんでした。
Francesco Casula

6
これは、forループでキーと値の両方を取得することについて尋ねられている、当面の質問に対する最良の回答です。
cipak 2018年

4
これは実際には質問に回答するため、承認された回答は更新する必要がありますが、質問時には利用できませんでした。
Marc Qualie、2018年

1
この質問を確認することをお勧めします:stackoverflow.com/questions/47213651/…これは、このタイプの構文が推奨されることを示しているようです:Object.keys(myObject).forEach(key => {...
Will59

519
for (var k in target){
    if (target.hasOwnProperty(k)) {
         alert("Key is " + k + ", value is " + target[k]);
    }
}

hasOwnPropertytargetプロトタイプから継承したのではなく、実際にそのプロパティがあるかどうかを確認するために使用されます。少し簡単になるでしょう:

for (var k in target){
    if (typeof target[k] !== 'function') {
         alert("Key is " + k + ", value is" + target[k]);
    }
}

kメソッドではないことを確認するだけtargetですarrayあなたがメソッドの多くを得るでしょうが、例えば警告indexOfpushpop、など。)


87
「独自の」プロパティのみを反復処理する別の方法は、Object.keysです。Object.keys(target).forEach(function (key) { target[key]; });
katspaugh、2011

3
targetを使用して作成した場合は機能しませんObject.create(null)。コードを変更する必要がありますtarget.hasOwnProperty(k)->Object.prototype.hasOwnProperty.call(target,k)
Azder

問題の例で与えられた変数を使用しないのはなぜですか?ここではどのようなものですktargetproperty?私にとって、JavaScript以外のこの未定義の領域:)
Gediminas 2017年

2
Object.keys(target).forEach((key)=> {target [key];}); Angular向け
askilondz 2017

315

誰も言及していObject.keysないので、私はそれに言及します。

Object.keys(obj).forEach(function (key) {
   // do something with obj[key]
});

3
注:IE8以前ではサポートされていません。
Edwin Stoteler 2014

1
この時点で、ES5シムを使用する必要があります。ES6の未来に生きているなら、for of tc39wiki.calculist.org
es6 /

17
「例外をスローする以外にforEach()ループを停止または解除する方法はない」
rluks

Object.keys(obj).forEach((key)=> {}); Angular向け
askilondz 2017

ES6では動作しないか、理解できません。Felixには、以下のより良くて読みやすい答えがあります:data.forEach(function(value、index){console.log(index); // 0、1、2 ...});
gtamborero

115

のために...で動作します。

for( var key in obj ) {
  var value = obj[key];
}

最近のJavaScriptではこれも行うことができます:

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

}

64
var obj = {...};
for (var key in obj) {
    var value = obj[key];

}

PHPの構文は単なる砂糖です。


これは、継承されたすべてのプロパティでも繰り返されます。これを回避するには、.hasOwnProperty()を使用します。
LSerni

24

私はあなたがそれiが鍵であり、あなたが経由して値を得ることができることを知っていると仮定しますdata[i](そしてこのためのショートカットが欲しいだけです)。

ECMAScript5 は配列のforEach [MDN]を導入しました(配列があるようです):

data.forEach(function(value, index) {

});

MDNのドキュメントは、それをサポートしていないブラウザにシムを提供します。

もちろん、これはオブジェクトに対しては機能しませんが、オブジェクトに対して同様の関数を作成できます。

function forEach(object, callback) {
    for(var prop in object) {
        if(object.hasOwnProperty(prop)) {
            callback(prop, object[prop]);
        }
    }
}

あなたが質問にタグ付けしたので 、jQueryは配列とオブジェクト構造の両方をループする$.each [ドキュメント]を提供します。


それforEachはオブジェクトではなく配列forEachです。

2
そう?どうやらOPは配列をループしています。
Felix Kling

また、Mozilla(Firefox、SpiderMonkey-C、Rhino&c)には、for each構文を許可する非標準の拡張機能があります。for each (let val in myObj) console.log(val);
katspaugh 2011

2
@katspaugh:そうですが、それはMozillaだけなので、あまり役に立たないようです。
Felix Kling、2011

回答ありがとうございます。あなたが提供した情報を読み上げます。答えの最初のあなたの仮定は正しかったです、しかし私がこのプロジェクトで頭に集中しすぎて、集中できず、それを忘れることができなかったことを除いて、私はそれを知っていました。ありがとう。
キャバレー


9
for (var key in myMap) {
    if (myMap.hasOwnProperty(key)) {
        console.log("key =" + key);
        console.log("value =" + myMap[key]);
    }
}

JavaScriptでは、すべてのオブジェクトに、メタ情報を持つ組み込みのキーと値のペアがたくさんあります。オブジェクトのすべてのキーと値のペアをループすると、それらもループします。hasOwnProperty()を使用すると、これらが除外されます。


2

ES6は、このように使用できるMap.prototype.forEach(callback)を提供します

myMap.forEach(function(value, key, myMap) {
                        // Do something
                    });

2
パラメータmyMapは何ですか?
phil294

マップはオブジェクトではありません。それらは完全に別のものです。
Dakusan

2
forEach関数には配列の「キー」は含まれていませんが、現在反復している要素のインデックスが含まれています。
Francis Malloch 2017

2
let test = {a: 1, b: 2, c: 3};
Object.entries(test).forEach(([key, value]) => console.log(key, value))

// a 1
// b 2
// c 3

5
理解できないかもしれないプレーンなコードを投稿する代わりに、投稿したコードに説明を追加することができます。
AaoIi

Object.entriesは、元のオブジェクトのキーと値のペアに基づいて配列の配列を引き出します[['a', 1],['b',2],['c',3]]forEachキー/値のアレイの各々を解体しての2つの変数を設定keyし、valueここで出力-あなたが関数内で必要として使用されるように、console.log
Mark Swardstrom


1

以下は、できるだけ近づく例です。

for(var key in data){
  var value = data[key];    
  //your processing here
}

jQueryを使用している場合は、http://api.jquery.com/jQuery.each/を参照してください。


1

使用している場合はLodashを、あなたが使用することができます_.forEach

_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
  console.log(key + ": " + value);
});
// => Logs 'a: 1' then 'b: 2' (iteration order is not guaranteed).

1

この質問が出されてからのこの数年で、JavaScriptはいくつかの新機能を追加しました。その1つがObject.Entriesメソッドです。

MDNから直接コピーしたものは、次のコードスニペットです。


const object1 = {
  a: 'somestring',
  b: 42
};

for (let [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}

-2

はい、JavaScriptでも連想配列を使用できます。

var obj = 
{
    name:'some name',
    otherProperty:'prop value',
    date: new Date()
};
for(i in obj)
{
    var propVal = obj[i]; // i is the key, and obj[i] is the value ...
}

@PaulPRO ... javascriptのすべてがキーと値のペアです(したがって、オブジェクトは実際にはキーと値のペアの連想配列です...)
Alex Pacurar

@AlexPacurarと連想配列には順序があります。オブジェクトは順不同です。それは大きな違いです
レイノス

@Raynosあなたは正しいかもしれません...オブジェクトがどのように順序付けされていないかを正確に説明することは大きな助けになります...上記の例を考えると、forループの「i」が[name、otherProperty、そして最後に日付] ...オブジェクトのプロパティの順序がどのような状況で混合されるのでしょうか?
Alex Pacurar 2011

@AlexPacurarオブジェクトをループする特定の順序は、ブラウザ固有です。アルファベット順で実行するものもあれば、定義の順序で実行するものもある
Raynos '30

3
@Raynos:連想配列は必ずしも順序付けられていますか?私はしばしばこの用語がより一般的に使用されるのを見てきました。たとえば、連想配列のWikipediaの記事
Jeremy Banks、

-8
var global = (function() {
   return this;
})();

// Pair object, similar to Python

function Pair(key, value) {
    this.key = key;
    this.value = value;

    this.toString = function() {
       return "(" + key + ", " + value + ")";
    };
}

/**
 * as function
 * @param {String} dataName A String holding the name of your pairs list.
 * @return {Array:Pair} The data list filled
 *    with all pair objects.
 */
Object.prototype.as = function(dataName) {
    var value, key, data;
    global[dataName] = data = [];

    for (key in this) {
       if (this.hasOwnProperty(key)) {
          value = this[key];

          (function() {
             var k = key,
                 v = value;

            data.push(new Pair(k, v));
          })();
       }
    }

    return data;
};

var d = {
   'one': 1,
   'two': 2
};

// Loop on your (key, list) pairs in this way
for (var i = 0, max = d.as("data").length; i < max; i += 1) {
   key = data[i].key;
   value = data[i].value;

   console.log("key: " + key + ", value: " + value);
}

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