【问题标题】:For loop for key/value pairs when key is numeric当键为数字时,用于键/值对的循环
【发布时间】:2013-03-06 20:44:29
【问题描述】:

我刚刚意识到我的整个网络应用程序出现了故障,它归结为一个正在重新排序我的对象/数组的 for 循环。

我正在通过 AJAX 检索关联数组(对象)。我可以在返回时检查它的结构,它是正确的。例如:

48 => Value1
50 => Value2
49 => Value3
51 => Value4

但是,当我遍历它时,for 循环会重新排序对象。这是因为关联键是数字的。它们代表数据库中的数字 ID。我不知道 javascript 会扼杀它们并尝试将它们按数字顺序变成基本的数组键。因此,它吐出为:

48 => Value1
49 => Value3
50 => Value2
51 => Value4

如何按构建顺序循环遍历对象?我必须用字符串作为键来构建对象吗?就像“ID22”替换 22。或者有什么方法可以强制 javascript 以特定顺序循环?

谢谢! 马特

【问题讨论】:

  • 我通常使用 ["_" + i] 以防止任何混淆。另外,在某些语言(php??)中,添加索引 49 然后 51 将自动提供索引 50,我对此不太满意......此外,正如 SOverflow 中多次评论的那样,关联数组从技术上讲是不合适的在 JavaScript 中。如果我没记错的话,应该使用对象和属性。
  • 谢谢,塞巴斯。这些实际上是对象。我只知道对象是 javascript 对关联数组(类似 php 的语言)的回答,所以我用括号中的“对象”来称呼它。 :-)

标签: javascript arrays loops key sorting


【解决方案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]

【讨论】:

  • 谢谢!现在我只是想弄清楚如何打包所有这些,以便它适用于 php 端和 javascript 端。而不是传回一个 php 数组(JSON 编码,然后由 JS 评估),我必须传回一个数组和一个对象。我得重新做一些事情。
【解决方案2】:

这只是 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"}
]

它最终比替代解决方法更干净(正如您最初建议的那样)

【讨论】:

  • array 解决了这个问题,但是有一个新问题,你不能通过 id 访问对象
  • 这是它的主要缺点,我倾向于使用 objById 函数,它只循环获取值 function objById(arr, id){for (var x=0; x<arr.length; x++){if(arr[x].id==id){return arr[x]["value"];}} return false;}
【解决方案3】:

我相信您正在使用for…in 来检索您的密钥和值。

正如上面的链接所说,正如它在ECMAScript specs 中指定的那样,“枚举属性的机制和顺序(第一个算法中的步骤 6.a,第二个算法中的步骤 7.a)不是指定。”

这意味着,您完全不能依赖通过for…inObject.keys 获得的订单。如果订单对您很重要,您必须将订单的索引存储在某处,并按该属性对数据进行排序。你不能像这样只使用Object

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多