2013年10月14日 星期一

Javascript的array排序(包含2維array)

JS的array怎麼宣告使用?如下,宣告array時不用告知長度,就要多少用多少。

var MyArray = [];
MyArray[0] = 10;
MyArray[1] = 20;



那二維array怎麼用呢?如下,同樣的概念,要多少用多少,然後告知那個位址是個array就好

var MyArray = [];
MyArray[0] = [];
MyArray[1] = [];
MyArray[0][0] = 10;
MyArray[0][1] = 15;

MyArray[1][0] = 20;
MyArray[1][1] = 30;


不過二維array有個指定用法,說明如下,一樣是二維array,但是,用的是指定該column的名稱的方式,這樣在後續使用的時候,可以不用記得是第幾維,只要指定正確的column名稱就好了。

var MyArray = [];
MyArray[0] = [];
MyArray[1] = [];
MyArray[0]["id"] = 10;
MyArray[0]["id"] = 15;

MyArray[1]["Email"] = 20;
MyArray[1]["Email"] = 30;




準備工作完成,瞭解JS的array使用方式之後,來看看排序吧
一維array很簡單,就呼叫MyArray .sort(),就這樣(如果想瞭解工作的原理,請看本文最下方的補充。)MyArray就會變成排序完成的Array(所以如果要保留原本的Array,請利用 var SourceMyArray = MyArray.slice(0);這個函式)


二維就比較複雜一些。要告訴sort()函式,我要用哪一維來排序,方法為何。這個寫法上就是:

MyArray.sort( function(a,b)
{
return a["id"].toUpperCase() < b["id"].toUpperCase() ? -1 : ( a["id"].toUpperCase() > b["id"].toUpperCase() ? 1 : 0 );
//return a["id"].toUpperCase() > b["id"].toUpperCase(); 錯誤的寫法,漏掉了等於的情況
});



大概的意思就是告訴排序函式幫我用id這個欄位幫我做排序,排序方法則是拿兩者比大小,並根據結果傳回-1或1或0。其中有個有趣的發現,當你用了上面我註解掉的那一行的錯誤的寫法,在10筆資料內的排序都會正確,一旦超過10筆,就會排序錯誤,為什麼?還真研究不出來,日後若有人知道原因,煩請告訴我喔。



這個範例程式放在這裡



可以自行貼到http://jsfiddle.net/或者是http://htmledit.squarefree.com/來做測試喔



補充說明JavaScript的Sort:

  • sort 在適當的位置排序陣列的元素。
var a = ['Wind', 'Rain', 'Fire'];
a.sort();
print(a); // Fire,Rain,Wind
sort 也可以接受 Callback 函數來決定如何排序陣列的內容。這個函數會對兩個值做比較,並返回下列三個值其中之一︰
  • 如果 a 在排序系統中小於 b,返回 -1(或任意的負數)
  • 如果 a 在排序系統中大於 b,返回 1(或任意的正數)
  • 如果 a 和 b 被認為是相等的,返回 0。
例如,下面的例子會以字串的最後一個字母來排序︰
var a = ['Wind', 'Rain', 'Fire'];
function sortFn(a, b) {
  var lastA = a[a.length - 1];
  var lastB = b[b.length - 1];
  if (lastA < lastB) return -1;
  if (lastA > lastB) return 1;
  if (lastA == lastB) return 0;
}
a.sort(sortFn);
print(a); // Wind,Fire,Rain

1 則留言:

  1. 一旦超過10筆,就會排序錯誤,為什麼?還真研究不出來,日後若有人知道原因,煩請告訴我喔。
    >>這個原因是因為 js在10比之前做的排序都是冒泡法,一旦超過10筆就是使用二分法
    >>是js陣列排序原生的設定,建議可以自己寫不用原生的設定,日後要除錯就比較容易

    回覆刪除