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