当键是数字时,用于键/值对的循环

时间:2013-03-06 20:44:29

标签: javascript arrays loops key sorting

我刚刚意识到我的整个网络应用程序出现了故障,而且它正在进入一个重新排序我的对象/数组的for循环。

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

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

但是,当我遍历它时,for循环重新排序对象。这是因为关键字是数字。它们代表数据库的数字ID。我不知道javascript会阻塞它们并尝试按数字顺序将它们转换为基本数组键。所以,它吐出来:

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

如何按照我构建它的顺序遍历对象?我是否必须使用字符串作为键来构建对象?就像“ID22”取代22.或者是否有某种方法可以强制javascript按特定顺序循环?

谢谢! 马特

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

这只是Chrome的一个问题,他们有一个错误,但为了提高内部效率,这是一个“不会修复”。

我发现解决此问题的最佳方法是使用对象进行更改:

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

改为像这样的数组:

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

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

答案 2 :(得分:0)

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

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

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