ga('set', 'anonymizeIp', 1);
Categories: CodingJavascript

[JS] Sort JSON Objects in Javascript

Share

資料處理是一門學問,將錯綜複雜轉變為規律協調的過程。

本文將演示如何對JSON Object中依照某個name的value做排序。

簡單介紹 JSON 資料格式

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"
	}]
}

JSON 排序

接下來示範如何在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' } ]

Jys

Published by
Jys

Recent Posts

[python] Flask Create RESTful API

This article gi... Read More

3 年 前發表

[Javascript] 新增/刪除JSON中key值

在web訊息交換常會需要對JS... Read More

3 年 前發表

[JAVA] SQL Server Connection

本文介紹JAVA連線SQL s... Read More

3 年 前發表