我在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里面为什么它改变了数据的顺序。任何建议。
答案 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)
行,但添加它是一个好习惯。
迭代对象属性不会保持顺序。
要对元素进行排序,您必须像第一个问题一样制作数组并对该数组进行排序。
当浏览器解释您的response
变量时,它会显示如下:
{
4:{
"id":"4"
}
6:{
"id":"6"
}
};
这是chrome的输出:
某些浏览器存储按属性名称排序的对象。因此,合理的是,当你迭代它们时,它们将不会被订购。
目前你无能为力。
答案 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);
});