2

数组(注意项目的顺序):

{
  "5":{
      "Title":"Title A",
      "Desc":"Description A"
  },
  "15":{
      "Title":"Title B",
      "Desc":"Description B"
  },
  "10":{
      "Title":"Title C",
      "Desc":"Description C"
  },
  "1":{
      "Title":"Title D",
      "Desc":"Description D"
  },
  "20":{
      "Title":"Title E",
      "Desc":"Description E"
  }
}

现在,如果在 chrome 或 IE9 上运行,下面的 js 代码确实会改变顺序。

for ( var i in data ) {
    alert(JSON.stringify(data[i]));
}

IE8 保留原始顺序,而较新的浏览器将顺序更改为 1、5、10、15、20。

知道为什么会发生这种情况吗?是否可以在较新的浏览器中保留原始顺序?

非常感谢,卢克

4

2 回答 2

6

你所拥有的不是一个数组。它只是一个对象,属性的呈现顺序是不确定的。

编辑——有趣的事实:规范说,如果一个实现决定在for ... in语句中宣传某些特定的顺序,那么Object.keys()必须遵守相同的顺序规则。然而,不需要这样的规则。该规范没有详细说明实现的“未定义”程度,但对我来说,一个好的经验法则是编码好像顺序可能是主动随机的:-)

于 2013-01-02T17:37:13.867 回答
1

你所拥有的不是一个数组,而是一个对象。对象没有任何顺序。浏览器以他们想要的任何顺序返回键。

如果您想要一些固定的顺序,请将您的对象放入一个数组中:

{
    "objects": [
        {
            "id": "5",
            "Title":"Title A",
            "Desc":"Description A"
        },
        {
            "id": "15",
            "Title":"Title B",
            "Desc":"Description B"
        },
        {
            "id": "10",
            "Title":"Title C",
            "Desc":"Description C"
        },
        {
            "id": "1",
            "Title":"Title D",
            "Desc":"Description D"
        },
        {
            "id": "20"
            "Title":"Title E",
            "Desc":"Description E"
        }
    }
}
于 2013-01-02T17:39:46.757 回答