提问者:小点点

关联数组对象上的JavaScript foreach循环


为什么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/


共3个答案

匿名用户

属性仅跟踪具有数字索引(键)的属性。你用字符串作为钥匙。

您可以这样做:

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]);
}

编辑-现在最好注意对象。keys()函数在现代浏览器和节点等中可用。该函数以数组形式返回对象的“自有”键:

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

传递给. foreach()的回调函数是通过Object.keys()返回的数组中的每个键和键的索引来调用的。它还传递了函数迭代所通过的数组,但是该数组对我们并不真正有用;我们需要原始对象。它可以通过名称直接访问,但是(在我看来)显式地传递它会更好一点,这是通过将第二个参数传递给来实现的。回调里面。(刚刚看到下面的评论中提到了这一点。)

匿名用户

这是非常简单的方法。优点是你也可以得到钥匙:

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)
})

匿名用户

如果Node.js或浏览器支持Object.entries(),它可以用作使用Object.keys()的替代方法。

const h = {
  a: 1,
  b: 2
};

Object.entries(h).forEach(([key, value]) => console.log(value));
// logs 1, 2