【问题标题】:Array ordering in javascript - different results comparing IE8 and Chromejavascript中的数组排序-比较IE8和Chrome的不同结果
【发布时间】:2013-01-03 01:54:49
【问题描述】:

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

{
  "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。

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

非常感谢,卢克

【问题讨论】:

  • 那不是数组。那是一个对象。对象没有顺序。
  • +1 为例。我一直想看到一个证据,证明属性顺序没有保留在对象中。
  • 对于那些好奇的人来说,JavaScript 对象基本上是作为字典/哈希表实现的。因此,未定义的排序。

标签: javascript arrays google-chrome internet-explorer-8 cross-browser


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    {
        "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"
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2011-11-26
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      相关资源
      最近更新 更多