迭代Javascript数组

时间:2014-04-16 12:56:15

标签: javascript arrays

我在google上找到但没有得到任何指示,所以发布在这里。我在javascript中使用json数组与ajax.From控制器我得到像这样的json数组:

var response= {"6":{"id":"6"},"4":{"id":"4"}};

在javascript迭代之后:

for (var i in response) {
   alert(response[i].id);
 }

数据的顺序改变,即4,6。 在javascript里面为什么它改变了数据的顺序。任何建议。

6 个答案:

答案 0 :(得分:2)

你不应该像那样迭代数组。

为什么?

在javascript中,一切都是对象。甚至是数组。

for (var i in response)

特定于对象。所以它也适用于数组,但会将结果作为属性。

属性是排序的或任意的,因此您的奇怪的输出顺序。

此外,如果有人修改了protorype对象的Array并添加了新属性,那么您将收到错误,而且您的代码肯定会中断。​​

您可以使用hasOwnProperty(i)

修复上一个问题

怎么样?

你应该这样做:

for (var i = 0, iLength = response.length; i < iLength ; i++) {
   alert(response[i].id);
}

使用经典for循环但缓存长度。这样它就是最快的循环之一。它在IE8中快了2倍。

更新回答

在更新的问题中,您希望迭代map

在常规对象的javascript a map中,为了迭代它,你必须迭代它的属性。

for (var i in response)
    if(response.hasOwnProperty(i))
        alert(response[i].id);

此处不需要response.hasOwnProperty(i)行,但添加它是一个好习惯。

迭代对象属性不会保持顺序。

要对元素进行排序,您必须像第一个问题一样制作数组并对该数组进行排序。

更新2:

当浏览器解释您的response变量时,它会显示如下:

{
   4:{
       "id":"4"
   }
   6:{
       "id":"6"
   }
};

这是chrome的输出:

chrome object structure output

某些浏览器存储按属性名称排序的对象。因此,合理的是,当你迭代它们时,它们将不会被订购。

目前你无能为力。

答案 1 :(得分:1)

The for (x in y) operator任意顺序迭代对象的可枚举属性。

改为使用常规循环:

for (var i=0; i<response.length; i++) {
    alert(response[i].id);
}

编辑后,response不再是数组而是对象。对象的属性没有固有的顺序。 JavaScript不记得它们的声明顺序。

您可以将属性的名称复制到数组中,然后对其进行排序:

var response = {"6":{"id":"6"},"4":{"id":"4",}};
var sorted = new Array();
for (var obj in response) {
    sorted.push(obj);
}
sorted.sort(function(a,b) { return a - b; });
for (var i=0; i<sorted.length; i++) {
    alert(response[sorted[i]].id);
}

答案 2 :(得分:0)

不确定for (var x in z)的订单是什么。 此外,IE不仅会返回数组中的项目,还会返回一些数组函数/属性:(

根据我的经验,大部分时间都应该避免使用for (var x in z) javascript(至少对于Arrays)。

请尝试使用此代码:

for (var i = 0; i < response.length; i++) {
   alert(response[i].id);
 }

答案 3 :(得分:0)

使用标准for循环(您控制属性的顺序)而不是for in循环(它以无特定顺序获取属性)。

for (var i = 0; i < response.length; i++) {
    alert(response[i].id);
}

答案 4 :(得分:0)

此处http://jsfiddle.net/an9Gf/有效。但是对于in不应该与数组一起使用,仅用于对象。 无论如何尝试用一个普通的老式循环。

var i =0;
for(i=0;i<response.length;i++){
  alert(response[i].id);
}

答案 5 :(得分:0)

您不应该使用for..in来迭代数组。使用迭代方法。

response.forEach(function (elem) {
    console.log(elem.id);
});