在Chrome中迭代jQuery JSON对象改变顺序

时间:2014-06-13 14:34:14

标签: javascript jquery json google-chrome

Jquery + rails 4

json_data实例中,我有一些带键和值的数据,键是一个整数id,值是一个包含数据的对象。但是,当我尝试使用jQuery $ .each迭代这些数据时函数,结果返回按键排序。如何以原始顺序迭代我的对象集合?

$.each(json_data, function(key, value){
 console.log(key);
      });

key = 6181 30654 39148 30743 30510 42998 5788 30401 ... // Mozilla工作正常(右)

key = 5788 6011 6181 30401 30510 30639 30654 30698 30743 ... // Chrome无法正常工作(错误)

1 个答案:

答案 0 :(得分:0)

关于对象中的“顺序”:

JavaScript对象是一个哈希表,并且针对key:value对的常量时间查找进行了优化。

数组是一种数据结构,其中元素被分配给离散索引值。迭代数组的元素时,将返回与数组中项的顺序匹配的可预测模式。

然而,在一个对象中,没有索引值,因此没有可持续的可预测方法来按顺序迭代它。该对象仅存储为常量时间查找而优化的键:值对。

编辑:我将演示这两种迭代方法仅仅是为了说明,但我想提前警告你,他们不会改变你不会以一致的顺序返回键的事实。

var json_data = {6181:true, 30654:true, 39148:true, 30743:true, 30510:true, 42998:true, 5788:true, 30401:true};
for(item in json_data){
  console.log(item);
} // *might* return a different order based on browser or JavaScript implementation

再澄清一次:对象与特定的“订单”无关。它们经过优化,可提供“恒定时间”查找。无论对象的大小如何,如果查询某个键,相关的值将在固定的时间内返回给您。

如果您需要强加特定订单,则需要使用数组。

示例:

var json_data = [6181, 30654, 39148, 30743, 30510, 42998, 5788, 30401];

for(var i = 0; i < json_data.length; i++){
  console.log(json_data[i]);
}
// always returns the values in the same order they are in the json_data array.
// changing the order in the array will change the order they are output and
// and that order will be the same regardless of which browser or version of JavaScript you
// are using.