2012-03-23 31 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()來反轉鍵順序。

相關問題