資料處理是一門學問,將錯綜複雜轉變為規律協調的過程。
本文將演示如何對JSON Object中依照某個name的value做排序。
簡單介紹 JSON 資料格式
JSON Object:一個物件中包含許多pair,一組pair由一個name對應一個value,包含在 { } 中。
Array:JSON中,陣列是一個value的集合,包含在 [ ] 中。
name & value:鍵與值,不限定一對一,多於一個的value就用array表示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "animals": [ { "number":2, "name":"Dog" }, { "number":1, "name":"Zebra" }, { "number":4, "name":"Cat" }, { "number":3, "name":"Fish" }] } |
JSON 排序
接下來示範如何在javascript中排序收到的JSON資料。
以上面的animal資料為例子,如果今天要將animal依照number排序,要怎麼做呢?
很簡單,直接將JSON data存進一個變數中,在對這個變數做排序判斷並回傳即可,請看程式碼演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
var data = { "animals": [ { "number":2, "name":"Dog" }, { "number":1, "name":"Zebra" }, { "number":4, "name":"Cat" }, { "number":3, "name":"Fish" }] } function sortItem(x,y){ return ((x.number==y.number)?0:((x.number>y.number)?1:-1)); } var output = data.animals.sort(sortItem); console.log(output); |
可以看到我們在這一行
output = data.animals.sort(sortItem);
對animals做sort,為什麼這邊要額外call一個function,而不是直接sort()就好呢?
因為在js中如果直接對int做sort的話,是以ASCII來做字符排序,所以像是[1,2,11,22]做sort()的話,結果會是[1,11,2,22],這樣就不是我們要的結果,那麼該怎麼做呢?
解法是這樣,正常的int sort是用以下code實現:
1 2 3 4 5 |
var IntData = [1,22,11,2]; IntData.sort(function(a,b){ return a-b; }); console.log(IntData); |
這樣出來的結果就是[1,2,11,22],如果要輸出降冪排序的話,把return a-b改成return b-a就可以。
為什麼用這種方法就可以排序呢?
因為sort()中的function(a,b)是兩兩比較array中的元素,交換位置與否是看return值,如果是正值,就交換,0或負值,則不交換。
所以用上方的animal來看,其中的 sortItem function,
return ((x.number==y.number)?0:((x.number>y.number)?1:-1));
就是先判斷前值與後值是否相同,相同的話回傳0,此時不做交換;如果不同,那麼再判斷前值是否大於後值,如果大於後值,回傳1,此時交換位置,如果小於後值,回傳-1,此時不交換位置。
如此一來就能實現對數字升冪排序或是降冪排序了。
output結果就會是下面這樣:
1 2 3 4 |
[ { number: 1, name: 'Zebra' }, { number: 2, name: 'Dog' }, { number: 3, name: 'Fish' }, { number: 4, name: 'Cat' } ] |
留言