我刚刚意识到我的整个网络应用程序出现了故障,而且它正在进入一个重新排序我的对象/数组的for循环。
我正在通过AJAX检索关联数组(对象)。我可以在返回时检查它的结构,这是正确的。例如:
48 => Value1
50 => Value2
49 => Value3
51 => Value4
但是,当我遍历它时,for循环重新排序对象。这是因为关键字是数字。它们代表数据库的数字ID。我不知道javascript会阻塞它们并尝试按数字顺序将它们转换为基本数组键。所以,它吐出来:
48 => Value1
49 => Value3
50 => Value2
51 => Value4
如何按照我构建它的顺序遍历对象?我是否必须使用字符串作为键来构建对象?就像“ID22”取代22.或者是否有某种方法可以强制javascript按特定顺序循环?
谢谢! 马特
答案 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…in
或Object.keys
获得的订单。如果订单对您很重要,您必须将订单的索引存储在某处,并按该属性对数据进行排序。你不能仅仅使用这样的Object
。