202

for-each ループが JavaScript 連想配列オブジェクトを反復処理しないのはなぜですか?

// Defining an array
var array = [];

// Assigning values to corresponding keys
array["Main"] = "Main page";
array["Guide"] = "Guide page";
array["Articles"] = "Articles page";
array["Forum"] = "Forum board";

// Expected: loop over every item,
// yet it logs only "last" assigned value - "Forum"
for (var i = 0; i < array.length; i++) {
    console.log(array[i]);
}

jQueryeach()が役に立つかもしれません: https://api.jquery.com/jQuery.each/

4

9 に答える 9

349

プロパティは.length、数値インデックス (キー) を持つプロパティのみを追跡します。キーに文字列を使用しています。

あなたはこれを行うことができます:

var arr_jq_TabContents = {}; // no need for an array

arr_jq_TabContents["Main"] = jq_TabContents_Main;
arr_jq_TabContents["Guide"] = jq_TabContents_Guide;
arr_jq_TabContents["Articles"] = jq_TabContents_Articles;
arr_jq_TabContents["Forum"] = jq_TabContents_Forum;

for (var key in arr_jq_TabContents) {
    console.log(arr_jq_TabContents[key]);
}

安全のために、そのようなループでは、どのプロパティも予期しない継承の結果ではないことを確認することをお勧めします。

for (var key in arr_jq_TabContents) {
  if (arr_jq_TabContents.hasOwnProperty(key))
    console.log(arr_jq_TabContents[key]);
}

edit — 関数が最新のブラウザーや Node などで使用できることに注意するのはおそらく良い考えObject.keys()です。その関数は、オブジェクトの「所有」キーを配列として返します。

Object.keys(arr_jq_TabContents).forEach(function(key, index) {
  console.log(this[key]);
}, arr_jq_TabContents);

に渡されたコールバック関数.forEach()は、各キーと、によって返された配列内のキーのインデックスで呼び出されObject.keys()ます。関数が反復する配列も渡されますが、その配列は実際には役に立ちません。元のオブジェクトが必要です。これは名前で直接アクセスできますが、(私の意見では) 明示的に渡す方が少し良いです。これは、コールバック内.forEach()でバインドされる元のオブジェクトに 2 番目の引数を渡すことによって行われます。this(これが下のコメントに記載されているのを見ただけです。)

于 2013-09-14T17:42:52.860 に答える
91

これは非常に単純なアプローチです。利点は、キーも取得できることです。

for (var key in array) {
    var value = array[key];
    console.log(key, value);
}

ES6 の場合:

array.forEach(value => {
  console.log(value)
})

ES6 の場合 (値、インデックス、および配列自体が必要な場合):

array.forEach((value, index, self) => {
  console.log(value, index, self)
})
于 2015-03-14T02:35:33.850 に答える
4

arr_jq_TabContents[key]配列を 0-index 形式と見なします。

于 2016-08-05T11:45:38.437 に答える
0

var obj = {
  no: ["no", 32],
  nt: ["no", 32],
  nf: ["no", 32, 90]
};

count = -1; // Which must be a static value
for (i in obj) {
  count++;
  if (obj.hasOwnProperty(i)) {
    console.log(obj[i][count])
  };
};

このコードでは、配列が含まれているため、配列内の呼び出し値にブラケット メソッドを使用しました。ただし、簡単に言えば、変数iがプロパティのキーを持ち、ループを使用して連想配列の両方の値を呼び出すという考えです。

完璧な方法です。

于 2017-09-27T20:46:11.810 に答える