当前位置: 首页 > 面试题库 >

如果数字是正常值/预期值,Chrome会重新排序对象键

伍光济
2023-03-14
问题内容

我注意到某些评估电子商务网站某些鞋子尺码并将其输出到屏幕上的代码弄乱了Chrome的顺序。

给出的JSON可以是:

{
  "7": ["9149", "9139", "10455", "17208"],
  "7.5": ["9140", "9150", "10456", "17209"],
  "8": ["2684", "9141", "10457", "17210"],
  "8.5": ["9142", "10444", "10458", "17211"],
  "9": ["2685", "9143", "10459", "17212"],
  "9.5": ["10443", "9144", "10460", "17213"]
}

…将尺寸增加一半。

转换为对象并遍历键后,自然顺序受到尊重,它们的结果为:

7、7.5、8、8.5等

但是仅在Chrome中,“看起来”像是整数的键 总是 首先从对象中出来,因此for … in循环的输出为:

7、8、9、7.5、8.5、9.5 …

Object.keys(sizes); // ["7", "8", "9", "7.5", "8.5", "9.5"]

这是测试用例:https :
//jsfiddle.net/wcapc46L/1/

它仅影响整数,似乎Webkit / Blink进行了优化,使其 更喜欢 数字对象属性,这可能与Branch Prediction或其他有关。

如果为对象键添加任何字符作为前缀,则该顺序不会受到影响并按预期工作-FIFO

我想我记得读过,没有保证对象属性的顺序,但是同时,这非常烦人,并且会导致为单独使用chrome的用户进行大量的修复工作。

有任何想法吗?这有可能会得到修复的错误吗?

进行 额外的 编辑 ,现在我发现这是v8错误跟踪器上的一个问题:

http://code.google.com/p/v8/issues/detail?id=164

看起来Blink不想解决此问题,它将仍然是唯一可以解决此问题的浏览器。

更新 webkit / blink拥有的哈希表优化功能,现在已进入壁虎(FF 27.0.1)-http:
//jsfiddle.net/9Htmq/中的结果7,8,9,7.5,8.5,9.5_在键返回正确/预期顺序之前应用。

2017年更新 人们仍然upvoting和编辑会这样-这似乎并不影响Map/ WeakMapSet等等(这表现在已更新的主要例子)


问题答案:

这是v8处理关联数组的方式。已知问题Issue
164,
但遵循规范,因此标记为“按预期工作”。没有遍历关联数组的顺序。

一个简单的解决方法是在数字值前加上字母,例如:'size_7':['9149','9139']etc。

该标准将在下一个ECMAScript规范中更改,强制[chrome]开发人员进行更改。



 类似资料:
  • 问题内容: 我有一个带有几个键值对的对象数组,我需要根据’updated_at’对它们进行排序: 这样做最有效的方法是什么? 问题答案: 您可以使用。 这是一个例子:

  • 我有一个JavaScript对象数组: 如何在JavaScript中按照的值对它们进行排序? 我知道,但它似乎只适用于字符串和数字。是否需要向对象添加方法?

  • 问题内容: 我有一组字典,我想通过每个字典中的“ itemName”键按字母顺序对它们进行排序。如何在Swift中执行此操作? 我想对itemsArray进行排序。 问题答案: 您可以使用的功能: 迅捷 > 3 不是很迅速,但您失去了类型安全性,但这确实起作用。 顺便说一句,您的代码中有很多强制转换,有可能导致应用程序崩溃,您应该考虑改用可选的转换。

  • 我有一个带有键值对的数组,数组列是id和name。我想按ID对这个数组进行排序。 id列值的类型是字符串类型,但我想将它们排序为数字值,也应该在IE上工作 尽管顺序确实发生了变化,但它并没有像预期的那样发生变化,在IE中也会抛出一个错误。

  • 问题内容: 如何根据值对字典进行排序,以便输出为: 当前尝试(排序不正确): 问题答案: 您需要对字典值而不是键进行排序。您可以从字典中创建一个元组数组,按其值对它进行排序,如下所示: Xcode 9•Swift 4 或 Xcode 8•Swift 3 使用按键对字典进行排序 使用字典的键和本地化的比较来对字典进行排序:

  • 举个例子 那么,如何按日期对该数组进行排序? 这只是一个小例子,但它就像数组中的1000个对象。我在互联网上搜索并找到了一些使用函数的示例,但它在我的大数组中不起作用。