2012-03-23 51 views
5

我有一个Web服务,返回一个JSON编码的数据数组。然后,我使用jQuery的.each()函数遍历该数组,但在Firefox中迭代,而在Chrome中迭代。更改为.each()在Firefox和铬

从Web服务来sback的数据是:

{ 
    "data": { 
    "610": { 
     "id": "610", 
     "url": "a url 1", 
     "description": "XXX YYY", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    "608": { 
     "id": "608", 
     "url": "a url 1", 
     "description": "ytttgffrr", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    "607": { 
     "id": "607", 
     "url": "a url 3", 
     "description": "rtretert3", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    "606": { 
     "id": "606", 
     "url": "a url 4", 
     "description": "xxxwwww", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    ... 
    } 
} 

火狐进入610 - > 606,而镀铬FORS 606 - > 610

任何想法,为什么和我能做些什么?

+0

也许相关http://stackoverflow.com/questions/640745/google-chrome-javascript-associative-arrays-evaluated-out-of-sequence – 2012-03-23 16:48:38

+0

http://stackoverflow.com/questions/648139/is-the在JavaScript中的对象可预测的时间顺序 - – Dogbert 2012-03-23 16:49:06

回答

7

对象中的属性没有固有的顺序。 ECMAScript规范不保证for…in语句将按字母顺序通过其属性进行遍历。 jQuery.each在对象上使用时使用for…in

如果订单是对你很重要,使用数组,而不是一个对象。

+0

@Matt你编辑我的文章,所以你可以删除你upvote?优雅。 – 2012-03-23 17:37:35

0

物业枚举没有任何保证的顺序。如果您想以保证的顺序枚举属性,请将对象的固有属性放在数组中,按照您的期望对它们进行排序,然后枚举它。

在ES5,你可以简单地使用Object.keys()做到这一点;

var keys = Object.keys(yourObj).sort(); 

for (var i=0;i<keys.length;i++) { 
    // use yourObj[keys[i]]; guaranteed to be in the right order 
} 

如果你不使用HTML5的垫片或不能使用Object.keys() polyfiller,一个for in就足够了;

var keys = []; 

for (var x in yourObj) { 
    yourObj.hasOwnProperty(x) && keys.push(x); 
} 

keys.sort(); 

for (var i=0;i<keys.length;i++) { 
    // use yourObj[keys[i]]; guaranteed to be in the right order 
} 

当然,Array对象上的sort()函数允许您为自定义排序顺序指定一个函数。您还可以使用reverse()来反转键顺序。

相关问题