私はJavaScriptのPHP foreach
ループのような何かをする方法があるかどうか疑問に思いました。探している機能は次のようなものですPHP Snippet:
foreach($data as $key => $value) { }
JSのfor..in
ループを見ていましたが、as
を指定する方法はないようです。これを 'normal'のforループ(for(var i = 0; i < data.length; i++
)を使って行う場合、key => valueの組をつかむ方法はありますか?
for (var k in target){
if (target.hasOwnProperty(k)) {
alert("Key is " + k + ", value is" + target[k]);
}
}
hasOwnProperty
は、プロトタイプから継承したのではなく、あなたのtarget
が本当にそのプロパティを持っているかどうかをチェックするために使用されます。もう少し簡単になります:
for (var k in target){
if (typeof target[k] !== 'function') {
alert("Key is " + k + ", value is" + target[k]);
}
}
k
がメソッドではないことをチェックするだけです(target
がarray
であるかのように、警告される多くのメソッド、例えばindexOf
、Push
、pop
など)。
誰もObject.keys
を言及していないので、それを言及します。
Object.keys(obj).forEach(function (key) {
// do something with obj[key]
});
ES6 をネイティブに、または Babel (js compiler)と一緒に使用できる場合は、次のようにします。
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
loopによって提供される順序と同じ順序で返します(違いは、for-inループがプロトタイプチェーンのプロパティも列挙するということです) )。
それが役に立てば幸い! =)
for in
はあなたのために働くでしょう。オブジェクトを地図と考えるならば:
for(key in obj){
// The key is key
// The value is obj[key]
}
var obj = {...};
for (var key in obj) {
var value = obj[key];
}
Phpの構文は単なる砂糖です。
私はあなたが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 のタグを付けたので、jQueryは $.each
を提供します。 [docs] これは、配列構造とオブジェクト構造の両方をループします。
そのためにはfor..in
を使うことができます。
for (var key in data)
{
var value = data[key];
}
for (var key in myMap) {
if (myMap.hasOwnProperty(key)) {
console.log("key =" + key);
console.log("value =" + myMap[key]);
}
}
JavaScriptでは、すべてのオブジェクトにメタ情報を持つ一連の組み込みのキーと値のペアがあります。オブジェクトのすべてのキーと値のペアをループ処理すると、それらもループ処理されます。 hasOwnProperty()を使用すると、これらが除外されます。
ES6はMap.prototype.forEach(コールバック)を提供します。これはこのように使用することができます。
myMap.forEach(function(value, key, myMap) {
// Do something
});
let test = {a: 1, b: 2, c: 3};
Object.entries(test).forEach(([key, value]) => console.log(key, value))
// a 1
// b 2
// c 3
これには 'for in'ループを使用できます。
for (var key in bar) {
var value = bar[key];
}
以下は、あなたができる限り近づく例です。
for(var key in data){
var value = data[key];
//your processing here
}
JQueryを使用している場合は、次のURLを参照してください。 http://api.jquery.com/jQuery.each/
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).