2013-03-06 31 views
1

我刚刚意识到我的整体网络应用程序出现故障,并且它正在重新排序我的对象/数组。当键是数字时用于键/值对的循环

我正在通过AJAX检索关联数组(对象)。我可以在返回时检查它的结构,它是正确的。例如:

48 => Value1 
50 => Value2 
49 => Value3 
51 => Value4 

但是,当我循环它时,for循环将对象重新排序。这是因为assoc键是数字的。它们代表数据库中的数字ID。我不知道JavaScript会扼杀它们,并尝试将它们转换为数字顺序的基本数组键。因此,它吐出为:

48 => Value1 
49 => Value3 
50 => Value2 
51 => Value4 

如何循环通过对象的顺序,我建立它?我是否必须使用字符串作为键来构建对象?像“ID22”替换22.或者有什么方法来强制JavaScript以特定的顺序循环?

谢谢! Matt

+0

我通常使用[“_”+ i],所以我防止任何混淆。再加上在某些语言(php ??)添加索引49,然后51将自动喂食索引50,我并不高兴...另外,正如在SOVERflow中多次提到的那样,关联数组在技术上并不合适在JavaScript中。如果我正确记得,应该使用对象和属性。 – Sebas 2013-03-06 20:46:59

+0

可能重复[元素顺序在“for(... in ...)”循环](http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop) – Aaron 2013-03-06 20:50:34

+0

谢谢,Sebas 。实际上,这些是物体。我只知道对象是JavaScript对关联数组(ala语言如php)的回答,所以我将它称为parens中的“object”。:-) – Mattaton 2013-03-06 21:04:21

回答

1

无法按特定顺序迭代JavaScript对象,因为JS对象是无序的。

解决这个问题的最好办法 - 创建1个对象和一个数组来维持秩序:

var values = { 
    48: "Value1" 
    50: "Value2" 
    49: "Value3" 
    51: "Value4" 
} 
var order = [48, 50, 49, 51] //put proterty id here to keep order eg. [51, 50, 49, 48] 
+0

这将工作。 – sweetamylase 2013-03-06 21:11:44

+0

谢谢!现在我只想弄清楚如何打包所有这些,因此它适用于PHP端和JavaScript端。而不是传递一个PHP数组(JSON编码,然后由JS评估),我不得不传递一个数组和一个对象。我将不得不重做一些事情。 – Mattaton 2013-03-06 21:17:09

+0

它的工作原理!谢谢! – Mattaton 2013-03-06 22:07:05

0

这是唯一真正Chrome存在的问题,他们有这方面的错误,但它是一个“元” t修复“为了内部效率。

我找到解决这个问题的最好方法是使用一个对象发生变化:

{ 
    48: "Value1" 
    50: "Value2" 
    49: "Value3" 
    51: "Value4" 
} 

,而不是一个数组,像这样:

[ 
    {id: 48, value: "Value1"}, 
    {id: 50, value: "Value2"}, 
    {id: 49, value: "Value3"}, 
    {id: 51, value: "Value4"} 
] 

它最终被更干净比替代解决方法(这是你最初的建议)

+0

数组解决了这个问题,但是有一个新问题,你不能通过id访问对象 – 2013-03-06 21:00:58

+0

这是它的主要缺点,我倾向于使用一个objById函数,它只是循环访问值'function objById(arr,id) {for(var x = 0; x Doug 2013-03-07 14:01:53

0

我相信你使用for…in来检索您的密钥和价值。

如上面的链接所述,并且在ECMAScript specs,中指定“未指定枚举属性的机制和顺序(第一个算法中的步骤6.a,第二个步骤中的步骤7.a)”。

这意味着,您不能完全依赖您将通过for…inObject.keys获得的订单。如果订单对您很重要,则必须将订单的索引存储在某个位置,然后按该属性对数据进行排序。你不能仅仅使用这样的Object

相关问题