1

我刚刚意识到我的整个 Web 应用程序出现故障,它归结为一个正在重新排序我的对象/数组的 for 循环。

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

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

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

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

如何按构建的顺序循环遍历对象?我必须用字符串作为键来构建对象吗?就像“ID22”替换 22 一样。或者有什么方法可以强制 javascript 以特定顺序循环?

谢谢!马特

4

3 回答 3

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]
于 2013-03-06T20:49:17.457 回答
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"}
]

它最终比替代解决方法更干净(正如您最初建议的那样)

于 2013-03-06T20:51:25.333 回答
0

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

正如上面的链接所说,正如它在ECMAScript 规范中指定的那样,“枚举属性的机制和顺序(第一个算法中的步骤 6.a,第二个算法中的步骤 7.a)没有指定。”

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

于 2013-03-06T21:01:28.453 回答