最近在搞js 排序的問題,因為資料庫排序太耗資源,如果能轉移到客戶端去排序,能大大D減少伺服器記憶體消耗。客戶端的話,除了js,就是as了,可惜我as學得太爛,所以只能選擇js來研究研究了。 。 。經過我的測試,js內建方法sort的效率非常高
我們知道在js中預設提供了sort函數,但是這個函數預設是按照數組內容的ascii碼升序進行排列的,如果我們要對二維數組排序要如何做呢?在php中是有multi_sort函數可供呼叫的,但是在js中似乎沒有這種函數,但是沒關係 ,因為js的sort函數其實也提供了參數可以定義比較函數進行二維數組的排序。
1、按數值排序
假設有如下數組
var arr = [[1, 2, 3], [7, 2, 3], [3, 2, 3]];
這裡如果我們要按每個子數組的第一列來排序要如何做呢,我們可以定義一個比較函數:
arr.sort(function(x, y){
return x[0] – y[0];
});
這裡的比較函數的作用是什麼?其實是數組依序將陣列元素複製給x,y,例如先將arr[0]賦給x,arr[1]賦給y,然後用x[0] – y[0],根據傳回的值,如果傳回的是大於0的數,那麼就把數組中x放到y的後面,如果回傳的是0則不變,小於0則將x放到y的前面,然後第一個排序好之後在進行下面兩個的排序,直到整個陣列排序完成。這是預設升序的比較函數,如果要降序排列則只需修改比較方式,改為return y[0] – x[0] 即可,這裡我們x[0]表示是按第一列進行排序,我們這裡也可以按其他欄位進行排序。這裡的排序預設就會修改arr的陣列結構,所以排序完arr就是按第一列升序的陣列了。
2、按字串排序
按字串排序的話呢,我們可以利用js提供的localeCompare方法,
localeCompare作用:用本地特定的順序來比較兩個字串。
localeCompare方法的使用規則是stringObject.localeCompare(target),如果 stringObject 小於 target,則 localeCompare() 傳回小於 0 的數。如果 stringObject 大於 target,則該方法傳回大於 0 的數。如果兩個字串相等,或根據本地排序規則沒有區別,該方法返回0,器比較使用的是本地的規則,本地規則意思就是使用操作系統底層對這些本地字符排序的規則進行排序,默認情況下例如使用大於號這樣的比較只是純粹比較兩個字元的unicode的數大小,會與許多語言不符。
例如
var arr = [['中' ,'國'], ['啊','的'], ['哦','的']];
arr.sort(function(x, y){
return x[0]. localeCompare(y[0]);
});
結果就會按第一列文字的拼音排序,如果含有英文的話,預設是將英文放在前面,如果是純英文的話,會按字母順序來,大寫排在小寫的後面,這樣就可以實現字符串的排序了,包括中文和中英混排。至於要降序排列的話,方法與上面相同,改成return y[0].localeCompare(x[0]); 即可。
這樣排序的問題就實現了,js二維陣列排序用到的地方還是很多的。希望能幫上一些人的忙吧
function tblSort(s){
arrs[r]=[]
for(c=0;c arrs[r][c] arrs[r][c].html = table.rows[r].cells[ c].innerHTML//取表格HTML放進一個關聯數組裡面,用於排序後顯示在頁面上;
內容用於下面的判斷;
//偵測中可能的內容為 if(text == '-'){
r][c].text='-1';
}else if(
}else if(text=='無百度快照'||text=='無排名資料'){
}else if(text = = ''){
}else{
c].innerText//取表格文字內容放進一個關聯數組裡面。用於下面的sort做排序。
}
}
//alert(arrs[0][0][ 反序;
if(reve){
🎜> return parseFloat(y[s]['text']) - parseFloat(x[s]['text']) - parseFloat(x[s]['text']) - parseFloat' text'])
reve=0
arrs.sort(function(x,y){
]) - parseFloat(y[s]['text'])//排序
reve=1
}
> for(r = 0;r ){
table。 ][c]['html']
}
//表格排序結束