2012-12-07 213 views
5

我有一個ajax調用返回一個非常複雜的JSON對象,我很難排序它。如何通過嵌套值對JSON對象進行排序?

我的電話:

$.post('/reports-ajax',arguments, function(data) {} 

響應:

{ 
"10001":{ 
    "unitname":"Fort Worth", 
    "discounts":{"12-02-2012":"34.810000","12-03-2012":"20.810000","12-04-2012":"27.040000"}, 
    "gross":{"12-02-2012":"56.730000","12-03-2012":"19.350000","12-04-2012":"66.390000"}, 
    "net":{"12-02-2012":"61.920000","12-03-2012":"98.540000","12-04-2012":"39.350000"}, 
    "discounts_total":82.66, 
    "gross_total":82.47, 
    "net_total":99.81, 
    "number":10001 
    }, 
"10002":{ 
    "unitname":"Dallast", 
    "discounts":{"12-02-2012":"12.600000","12-03-2012":"25.780000","12-04-2012":"47.780000","12-05-2012":"45.210000"}, 
    "gross":{"12-02-2012":"29.370000","12-03-2012":"91.110000","12-04-2012":"60.890000","12-05-2012":"51.870000"}, 
    "net":{"12-02-2012":"16.770000","12-03-2012":"65.330000","12-04-2012":"13.110000","12-05-2012":"06.660000"}, 
    "discounts_total":131.37, 
    "gross_total":33.24, 
    "net_total":101.87, 
    "number":10002 
    }, 
"32402":{ 
    "unitname":"Austin", 
    "discounts":{"12-05-2012":"52.890000","12-02-2012":"22.430000","12-03-2012":"58.420000","12-04-2012":"53.130000"}, 
    "gross":{"12-05-2012":"25.020000","12-02-2012":"2836.010000","12-03-2012":"54.740000","12-04-2012":"45.330000"}, 
    "net":{"12-04-2012":"92.200000","12-05-2012":"72.130000","12-02-2012":"13.580000","12-03-2012":"96.320000"}, 
    "discounts_total":186.87, 
    "gross_total":161.1, 
    "net_total":174.23, 
    "number":32402 
    } 
} 

我去了功能與標準的每次呼叫,並做一些東西真棒與highcharts但現在我想排序net_total調用的響應,我無法弄清楚。

我試過.sort()它錯誤了,它不是一個函數。我一直在閱讀一段時間,但猜測我沒有找到正確的結果。這看起來很有希望:Sorting an array of JavaScript objects但它失敗與.sort不是一個函數。看起來大多數.sort在[]陣列不是全部對象..

任何幫助將不勝感激。

+1

這不是一個數組,它是一個對象。它具有名稱爲10001,10002和32402的屬性,它們本身不可排序。 – GolezTrol

+0

[排序JavaScript對象]的可能重複(http://stackoverflow.com/questions/1359761/sorting-a-javascript-object) – Bergi

回答

11

由於對象鍵沒有位置值,因此排序對象沒有意義。例如,這樣的:

{ a:1, b:2 } 

和此:

{ b:2, a:1 } 

完全相同的對象。它們不僅僅是相似的,它們也是一樣的。

javascript本身沒有提供任何位置值的對象鍵。有些人可能錯誤地認爲:

for (var key in obj) { 

以特定的順序遍歷對象鍵。但這是錯誤的。你應該總是假設for .. in循環總是以隨機的順序處理對象鍵。

顯然,如果你要編寫一個web瀏覽器,你不會實現一個隨機數生成器來解析一個for .. in循環。因此,大多數Web瀏覽器有一個意外穩定的for .. in循環過程如何對象鍵。

開發誰通過玩弄瀏覽器可能會弄清楚,通過按字母順序排列的對象,例如瀏覽器迭代或順序按鍵被添加到該對象學習JavaScript。但這完全是偶然的,不能依賴。瀏覽器供應商可能會在未來改變這種行爲不違反任何向後兼容性(除非與人誰相信的對象有一個排序順序寫的有毛病的scripts)。更何況,不同的瀏覽器有不同的JavaScript實現,因此不一定有對象相同的內部鍵排序。

所有上面是除了點。 「關鍵排序順序」在JavaScript中沒有任何意義,並且觀察到的任何行爲僅僅是實現細節。總之,javascript對象沒有鍵序,只是假設它是隨機的。


解決方案

現在,你真正要做的是排序的對象(你不能,也沒有意義)。你真正想要做的是按照特定的順序處理對象屬性。該解決方案是簡單地創建一個數組對象鍵(已經排序的順序),然​​後處理使用該陣列的對象:

// First create the array of keys/net_total so that we can sort it: 
var sort_array = []; 
for (var key in Response) { 
    sort_array.push({key:key,net_total:Response[key].net_total}); 
} 

// Now sort it: 
sort_array.sort(function(x,y){return x.net_total - y.net_total}); 

// Now process that object with it: 
for (var i=0;i<sort_array.length;i++) { 
    var item = Response[sort_array[i].key]; 

    // now do stuff with each item 
} 
+0

我喜歡T.J的回答,但是這保持了重要的關鍵。 –

5

你有沒有一個數組,並沒有秩序,所以你必須將其轉換爲一個數組,所以你可以給它的順序。

依稀:

var array = []; 
$.each(data, function(key, value) { 
    array.push(value); 
}); 
array.sort(function(a, b) { 
    return a.net_total - b.net_total; 
}); 

Live Example | Source

由於GolezTroi在評論中指出,通常上面會失去每一個條目存儲下data的關鍵,所以你要補充回來第一$.each環以上,但在這種情況下,條目已有他們的鑰匙(如number),所以沒有必要。

或者可以替換第一$.each$.map

var array = $.map(data, function(entry) { 
    return entry; 
}); 
// ...and then sort etc. 

......無論你喜歡。

+1

你將失去​​這個方法的鍵,但它的值仍然可用的屬性'數組中每個對象的數量。 – GolezTrol

+0

@GolezTrol:謝謝你,我會補充說音符。 –

相關問題