在JavaScript中的Foreach改变了我的数组的序列

时间:2014-07-22 19:03:41

标签: javascript arrays foreach

我在javascript中有关于foreach的问题

我在javascript中使用了以下数组:

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

如果我想做一个foreach,我会使用以下内容:

for (var k in puntos){
    if (puntos.hasOwnProperty(k))
    {
        console.log("Key is " + k + ", value is" + puntos[k]);
    }
}   

安全性:

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

输出结果为:

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

我的问题是为什么当我迭代数组(puntos)时,foreach改变了我的数组的安全性?

安全性:

puntos":{"2":"punto dos","3":"punto tres","4":"punto cuatro","5":"punto cinco","1":"punto 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
Key is 1, value ispunto uno

2 个答案:

答案 0 :(得分:1)

一个有趣的"为什么?"。

您创建的对象:

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问题here,其中讨论了这种行为的起源。因为这样的浏览器确实不尊重对象内元素的排序,甚至相同浏览器的不同版本也可以产生不同的结果,仅仅因为没有关于这种排序的ECMAScript标准。

现在 - 目前的情况 - 从经过测试的浏览器,IE11,Chrome,Firefox,Opera,所有这些都遵循相同的重新排序数字索引的模式。所有人都遵循"不要重新排序"文字索引。

而且 - 做什么:

  • 如果您从数据库中检索给定的集合,然后序列化,您可以(我猜)轻松地使索引成为文字(如 - " _1"或" 01& #34)
  • 如果你给了一个字符串然后你通过JSON.parse方法进行解析,你仍然可以使用.replace(/"(\d)*":/g, function(){ return '"_'+arguments[1]+'":' })
  • 替换这些数字
  • 如果您正在操纵JS对象,那么,遗憾的是,您无能为力。

答案 1 :(得分:0)

如果你真的想要它们,你可以使用这样的非数字键:

var puntos = {"p2":"punto dos","p3":"punto tres","p4":"punto cuatro","p5":"punto cinco","p1":"punto uno"};

尽管ECMAScript规范说不能保证对象属性的顺序,但实际上所有引擎都保留了顺序,除非你使用数字键,在这种情况下,某些引擎将sort the keys numerically正如你所注意到的那样。


将它们存储在实际数组中但使用无序键的另一种方法是使用对象数组:

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"
    }
];