2011-12-20 6 views
0

私はこのようにJavaScriptで出力する配列のキーをしようとしている:はJavascriptがためにイン声明

0 
1 
2 
3 
4 
5 
6 
7 
$family 
each 
clean 
associate 
link 
contains 
extend 
getLast 
getRandom 
include 
combine 
erase 
empty 
flatten 
hexToRgb 
rgbToHex 
min 
max 
average 
sum 
unique 
shuffle 

data=[8, 4, 6, 9, 5, 2, 4, 6]; 
for(i in data){console.log(i);} 

をしかし、その代わりのキーのみを出力し、それがこの出力しますどうして?そして、配列キーを出力した後、どうやって止めることができますか?

答えて

2

「で」ではなく「ノーマル」forループを使用する場合は、プロパティを確認して見ることができる:のすべてのプロパティを超える

for(var i = 0; i < data.length; i++) { 
    console.log(data[i]); 
} 

のJavaScriptのfor...in構造の繰り返し処理をオブジェクトであるので、すべてのプロパティ/メソッドをArray.prototypeに取得します(実際には、プロトタイプチェーンのすべての部分に移動します)。

+0

ブラウザのサポートが不足しているため、私は 'forEach'の使用を推奨していません。すべての主要なブラウザをサポートする必要がある場合は、信頼できるネイティブのforEachサポートについてはまだ数年は考えていません。 –

1

これは、配列がオブジェクトであり、for-inが配列インデックスではなくプロパティを反復するためです。あなたはこれを行うことができます:data.forEach(function(a,i){console.log(i);})するか、彼らはArray.prototypeを

1

for..inループは、オブジェクトのすべての列挙可能なプロパティを通過します。私はあなたの配列にこれらの余分なプロパティがどのように定義されたのかわかりません - Array.prototypeにライブラリを追加していますか?

従来のforループを使用すると、配列の数値でインデックスされた項目を通過する必要があります。これにより、他のプロパティは自動的に無視されます。

for (var i=0; i < data.length; i++) { 
    if (typeof data[i] !== "undefined") 
     console.log(i); 
} 

注最高の定義されたインデックスより1高い.length戻っていること、それはすべての下位のインデックスは、実際に私は」それらの値を持っていることを意味するものではありません:あなただけのインデックスが、その後何かのように出力したい場合各項目が定義されていないことを確認しました。 undefinedが配列内の有効な値である場合、それを削除することができます。実際には、配列に「穴」を持つ配列はほとんど使用しませんが、完全性のために言及します。

P.S. .forEach()を使用できますが、古いブラウザではサポートされていません。

+0

もし彼が 'delete'を使って要素を削除しない限り、すべての要素は値を持ち、' ​​undefined'も有効な値です。だから、通常は未定義のチェックは実際には必要ありません。 – ThiefMaster

+0

@ThiefMaster - 質問のサンプルについては問題はありませんが、より一般的な回答を提供しようとしていました。あなたが 'var x = [];と言うならば。 x [20] = true; 'インデックス20より小さいすべての要素は値を持たず、' delete'を使用しません。しかし、そうしたコードを書くことはまれであり、未定義は有効な値かもしれません。そのため、必要でない場合には、そのテストを削除することができるのです。 – nnnnnn

+0

その場合、配列の代わりにオブジェクトでなければなりません;) – ThiefMaster