2017-08-27 9 views
0

私はJSONオブジェクトを持っています(これは私が定義したものです)、その中の配列の値にアクセスしようとしています。私が何を誤解している正しいが、img.iNameの値は常にundefinedJavascript:連想配列のルーピングを理解していません

である3回ループしていますか?

<div id="dbgDIV">Debug Div<br></div> 
<script> 
    // imgs as a JSON array 
    var gallery = {"imgs": 
       [ // Height and Width to be added 
        {"iName":"File1.jpg", "tName": "File1_th.jpg","cap":"This is a Caption for File1"}, 
        {"iName":"File2.jpg", "tName": "File2_th.jpg","cap":"This is a Caption for File2"}, 
        {"iName":"File3.jpg", "tName": "File3_th.jpg","cap":"This is a Caption for File3"} 
       ], 
       "imgCount":"3" 
    }; 
    var dbgDIV = document.getElementById("dbgDIV"); 
    for (var img in gallery.imgs) { 
     dbgDIV.innerHTML = dbgDIV.innerHTML + "img=" + img.iName + "<br>"; 
     console.log(img.iName); 
    } 

</script> 
+0

使用 'in'」:私はあなたのようなもので行くことをお勧めしたい

(ジャバスクリプト内のすべての変数はオブジェクトです)。この配列の場合は、通常のforループを使用してください –

+0

すべてのブラウザに組み込まれているJavaScriptデバッガの使い方を学ぶことは非常に役立ちます。あなたのループを一歩進めれば、ループ内の 'img'が期待通りに配列要素への参照ではなく、代わりに_array index_、つまり' 0'、 '1'、または' 2 '。開発者用ツールとJavaScriptデバッガの使い方を学ぶには時間をかけてください。あなたはそれがあなたの価値があると分かります。以下は[Chrome DevToolsのガイド](https://developer.chrome.com/devtools)です。 –

+0

JavaScriptとJSONには「連想配列」がありません。彼らには_オブジェクトがあり、_アレイ_があります。 'gallery.imgs'は配列であり、さまざまな答えが指摘されているので、配列に対して' for'..in'ループを使うべきではありません。しかし、 'for'..'''の使用は実際の問題ではありませんでした!配列に対して 'for'..in''を使わない本当の理由は、' Array.prototype'が拡張されていれば、それらの余分なプロパティがあなたのループに現れます。上記の私のコメントは、問題の実際の理由を説明しています。 –

答えて

1

for...inループが問題です。ただ、配列のインデックスに伝統的なforループを使用します。

var gallery = { 
 
    "imgs": [ 
 
    { 
 
     "iName": "File1.jpg", 
 
     "tName": "File1_th.jpg", 
 
     "cap": "This is a Caption for File1" 
 
    }, 
 
    { 
 
     "iName": "File2.jpg", 
 
     "tName": "File2_th.jpg", 
 
     "cap": "This is a Caption for File2" 
 
    }, 
 
    { 
 
     "iName": "File3.jpg", 
 
     "tName": "File3_th.jpg", 
 
     "cap": "This is a Caption for File3" 
 
    } 
 
    ], 
 
    "imgCount": "3" 
 
}; 
 
var dbgDIV = document.getElementById("dbgDIV"); 
 
for (var i = 0; i < gallery.imgs.length; i++) { 
 
    var img = gallery.imgs[i]; 
 
    console.log(img.iName); 
 
}

+0

私は私には分かりませんが、大変ありがとうございます。1時間以上よく苦労しています。 – mcl

+0

あなたも使うことができます:for(gallery.imgs img){ – fjoe

+0

私は 'for'..'in'に同意しますがOPの問題の原因ではなかった配列や、数値の 'for'ループがそれを修正した理由ではありませんでした(そうではありませんでした)。本当の修正はOPのコードの 'img'の代わりに' gallery.imgs [i] '(ここで' i'はループ/配列のインデックスです)を使って、あなたが作った_other_の変更でした(OPは 'img'ここでも実際には配列インデックスでした)。そして、他の人が示唆しているように、 'for'..'of''や' .forEach()''は現代のブラウザではよりクリーンな解決策になります。非常に古いブラウザをサポートする必要がある場合、数字の 'for'ループは良いでしょう。 –

1

ザ・用... キー以上のループの繰り返し処理では、配列内のitll

0,1,2 
なるので、

これらの番号はiNameを持っていません。あなたはfor..ofループとを反復することもできます。

for(var img of gallery.imgs) 
1

あなたが代わりに使用したこのfor..inループでの/ループのためのforEach/...のために使用する必要があります。

はすぐにfor..inとfor..ofループの違いを実証する:

Object.prototype.objCustom = function() {}; 
Array.prototype.arrCustom = function() {}; 

let iterable = [3, 5, 7]; 
iterable.foo = 'hello'; 

for (let i in iterable) { 
    console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom" 
} 
for (let i of iterable) { 
    console.log(i); // logs 3, 5, 7 
} 

それは本当にあなたが望んでいたが、配列の要素を通過しないことを意味しているのを超えるすべての列挙のプロパティオブジェクト。オブジェクトリストのための

gallery.imgs.forEach(img => { 
    console.log(img.iName) // "File1.jpg" , "File2.jpg", ... 
});