首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >javascript中的Foreach更改了我数组的顺序

javascript中的Foreach更改了我数组的顺序
EN

Stack Overflow用户
提问于 2014-07-22 19:03:40
回答 2查看 88关注 0票数 0

我在javascript中有一个关于foreach的问题

我在javascript中有以下数组:

代码语言:javascript
复制
puntos":{"2":"punto dos","3":"punto tres","4":"punto cuatro","5":"punto cinco","1":"punto uno"}

如果我想做预测,我使用以下方法:

代码语言:javascript
复制
for (var k in puntos){
    if (puntos.hasOwnProperty(k))
    {
        console.log("Key is " + k + ", value is" + puntos[k]);
    }
}   

秩序:

代码语言:javascript
复制
puntos":{"2":"punto dos","3":"punto tres","4":"punto cuatro","5":"punto cinco","1":"punto uno"}

产出如下:

代码语言:javascript
复制
Key is 1, value ispunto uno
Key is 2, value ispunto dos
Key is 3, value ispunto tres
Key is 4, value ispunto cuatro
Key is 5, value ispunto cinco

我的问题是,为什么当我遍历数组时,前端改变了数组的顺序?

秩序:

代码语言:javascript
复制
puntos":{"2":"punto dos","3":"punto tres","4":"punto cuatro","5":"punto cinco","1":"punto uno"}

预期产出

代码语言:javascript
复制
Key is 2, value ispunto dos
Key is 3, value ispunto tres
Key is 4, value ispunto cuatro
Key is 5, value ispunto cinco
Key is 1, value ispunto uno
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-22 19:19:00

如果您真的想要它们的顺序,您可以使用如下非数字键:

代码语言:javascript
复制
var puntos = {"p2":"punto dos","p3":"punto tres","p4":"punto cuatro","p5":"punto cinco","p1":"punto uno"};

尽管ECMAScript规范说不能保证对象属性的顺序,但实际上所有引擎都保留顺序,除非使用数字键,在这种情况下,有些引擎会像您注意到的那样对键进行数字排序

另一种将它们存储在真正数组中但没有无序键的方法是使用一个对象数组:

代码语言:javascript
复制
var puntos = [
    {
        key: "2",
        value: "punto dos"
    },
    {
        key: "3",
        value: "punto tres"
    },
    {
        key: "4",
        value: "punto cuatro"
    },
    {
        key: "5",
        value: "punto cinco"
    },
    {
        key: "1",
        value: "punto uno"
    }
];
票数 0
EN

Stack Overflow用户

发布于 2014-07-22 19:35:00

有趣的“为什么?”

您要创建的对象为:

var a = {"puntos":{"2":"punto dos","3":"punto tres","4":"punto cuatro","5":"punto cinco","1":"punto uno"}};

将得到自动重新排序的密钥:

console.log(a)

Object {1: "punto uno", 2: "punto dos", 3: "punto tres", 4: "punto cuatro", 5: "punto cinco"}

但为什么会这样呢?

谷歌-有提到Chrome问题的这里,其中讨论了这种行为的成因。因为这样的浏览器确实不尊重对象中元素的排序,而且即使同一浏览器的不同版本也会产生不同的结果,这仅仅是因为没有关于这种排序的ECMAScript标准。

现在--目前的情况--从经过测试的浏览器、IE11、Chrome、Firefox和Opera上看,所有这些浏览器都遵循了重新排序数字索引的模式。所有这些都遵循“不重新排序”的文字索引。

以及-该做些什么:

  • 如果从数据库检索给定集,然后序列化,则可以(我猜)很容易地将索引设置为文字(如- "_1“或"01")。
  • 如果给您一个字符串,然后通过JSON.parse方法进行解析,则仍然可以使用.replace(/"(\d)*":/g, function(){ return '"_'+arguments[1]+'":' })替换数字
  • 如果您正在操作JS对象,那么,遗憾的是,您无能为力。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24895652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档