1

私が知っている限りでは、Javascript の配列はメソッドとオブジェクトの組み合わせに過ぎません。

今私の仕事は配列の値を表示することです(たとえばy_array

値を使用for(x in y_array)して表示しました。

mozilla と IE では正常に動作しますが、IE では配列の最初の要素をインデックスとして表示しindexOf、値はindexOf(obj, from)私が望んでいないものです。

私は試した

if(x!='indexOf') {  display the array value ; }

それは機能し、問題はありませんでしたが、配列の広範な使用が表示されており、このハードコードされたものではなく、永続的な修正を探しています。

誰でも私を助けてもらえますか?

4

3 に答える 3

10

配列とオブジェクトを混同したのはあなたが初めてではありません。SOには、この種の質問に対するFAQが含まれている必要があります;)

物事を説明しようとしましょう:

配列は値の行であり、行内の位置を使用して取得できます。配列値の順序は固定されています (並べ替えることができます)。

オブジェクトは、キーと値のペアの形式で名前付きプロパティを含む変数です。オブジェクトに属するキーと値のペアの順序は任意です。

配列は次のようになります[ 'first', 'second', 'third', ..., 'nth' ]
。 オブジェクトは次のようになります。{ first:'firstvalue', second:'secondvalue', ..., nth:'nthvalue' }

配列の最初の要素は、インデックス 0 の要素です (つまり、行の最初の位置のインデックス値は 0 です)。を使用して取得しますmyArray[0]

オブジェクトは順序付けされていないため、最初の要素はありません。myObject.somekeyまたはを使用して、要素を取得しますmyObject['somekey']

配列の場合、配列の最後に到達するまで番号付きインデックスを反復するループを使用します。

var i=0, len = myArray.length;
for ( i; i<len; i++ ) {
     //do something with >>> myArray[i] <<<
}

オブジェクトの場合、キーと演算子を使用してループを使用します(メソッドinでオブジェクトのユーザー定義プロパティのみを取得していることを確認してください)。.hasOwnAttribute

for ( var key in myObject ){
  if (myObject.hasOwnProperty(key)) {
     // do something with >>> myObject[key] <<<
  }
}

基本的に、配列は、それぞれに値が含まれる引き出し付きの食器棚と考えてください。オブジェクトは、箱の中身を説明するステッカーが蓋に貼られた箱の山として想像できます。オブジェクトから何かを取得するとき、次のように尋ねます: x の山に y のステッカーが貼られた箱はありますか。配列から何かを取得するとき、次のように尋ねます:引き出し nr x の内容を教えてください

あなたの質問について:ループで値を取得している配列にfor..inは、ユーザー定義のメソッド、つまり が含まれていますindexOf。それにオブジェクト スタイル ループを使用すると、配列はオブジェクトとして扱われ、indexOfキー (function(){...}きっと値付き) も表示されます。IE そのため、配列を反復処理する場合は、従来の for ループと数値インデックスを使用する方がよい場合があります。

これが IE だけにあるのはなぜですか? 最新のブラウザーindexOfでは、Arrayプロトタイプのネイティブ メソッドであり、ネイティブ メソッドは表示されません (プロトタイプをループしない限り)。IE < 9 には、配列用のネイティブの indexOf メソッドがありません。メソッドを使用するスクリプトのどこかで、ユーザー定義の拡張機能として Array プロトタイプに追加されています。

for ... in問題の結論:配列の値をループするために使用しないでください。

于 2011-04-14T08:01:51.200 に答える
6

配列の場合、これをループに使用する必要があります。

var y_array = [1,2,3,4];
for (var i = 0; i < y_array.length; i++) {
  var value = y_array[i];
  // do what you want
  alert(i + ': ' + value);
}

オブジェクト (オブジェクトは連想配列のようなもの - プロパティ: 値) の場合、次のループを使用します。

var y_array = { prop_1 : "value a", prop_2: "value_2", prop_3: 333 }
for (var key in y_array) {
   var value = y_array[key];
   // do what you want
   alert(key + ': ' + value);
}
于 2011-04-14T07:02:02.480 に答える
0

jsobObj = {} のような json オブジェクトに値がない場合。次に、IE < 9 の空のオブジェクトの側に indexOf プロトタイプ関数を取得しました。(function(){...} のような値で) も表示されます。

for ループの中で条件を確認できます。そのindexOfをスキップします。

if(key =='indexOf'){continue;}

例:

var jsonObj = { key_1 : "value a", key_2: "value_2", key_3: 333 }
for (var key in y_array) {
if(key == 'indexOf'){continue;}           // check if the array contain indexOf 
   var value = y_array[key];
   // do what you want
   alert(key + ': ' + value);
}
于 2014-01-24T09:33:55.587 に答える