1. 程式人生 > >JS對JSON物件遍歷輸出的時候真的是按照順序輸出嗎?

JS對JSON物件遍歷輸出的時候真的是按照順序輸出嗎?

  物件的遍歷輸出並不是按照物件屬性定義順序來的,那麼是按照什麼規則來的呢,仔細深入研究你會發現,這還跟瀏覽器有關係,Chrome跟IE是不一樣的,所以給出以下結論:

  Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版規範。因此,使用 for-in 語句遍歷物件屬性時遍歷書序並非屬性構建順序。而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是較老的 ECMA-262 第三版規範,屬性遍歷順序由屬性構建的順序決定。

  Chrome Opera 中使用 for-in 語句遍歷物件屬性時會遵循一個規律:
它們會先提取所有 key 的 parseFloat 值為非負整數的屬性,然後根據數字順序對屬性排序首先遍歷出來,然後按照物件定義的順序遍歷餘下的所有屬性。

那麼,解決辦法呢?

可以把物件通過Object.keys提取物件的key出來變成陣列,然後通過陣列的排序,然後遍歷陣列,通過key去取物件的屬性值。

  有一些業務要求對物件的各屬性值按照一定順序排列,而給定的物件屬性又不確定能按順序排列(如,數字大小順序)

 

//************************* JSON物件屬性排序*********************************//
//要求傳入引數 JsonData 為JSON物件
//輸出結果為JSON物件
//輸出的物件為按key值升序排列的
function JsonObjSort(JsonData) {
if(JsonData) { var JsonKeyArray=new Array(); for(x in JsonData) { var xToInt=parseInt(x); JsonKeyArray.push(xToInt); } JsonKeyArray=JsonKeyArray.sort();//對陣列升序排列 var NewJsonStr="" ; for(var i=0;i<JsonKeyArray.length;i++) {
if(i>0) { NewJsonStr += ','; } var value = JsonData[JsonKeyArray[i]]; NewJsonStr += '"'+JsonKeyArray[i]+ '"' +':'+value; } var NewJsonStrObj=eval('('+'{'+NewJsonStr+'}'+')'); //console.log(NewJsonStrObj); return NewJsonStrObj ; } else return ""; }