我們知道在js中默認提供了sort函數,但是這個函數默認是按照數組內容的ascii碼升序進行排列的,如果我們要對二維數組排序要如何做呢
最近在搞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){ for(r = 0;r < row_len;r++){ arrs[r]=[] for(c=0;c<cel_len;c++){ arrs[r][c] ={}//二維數組裡再創建一個對象; arrs[r][c].html = table.rows[r].cells[c].innerHTML//取表格HTML放進一個關聯數組裡面,用於排序後顯示在頁面上; var text = table.rows[r].cells[c].innerText//取得表格的文字內容用於下面的判斷; //檢測可能出現的內容如果不是正常的數據就變成負數,排在最後面; if(text == '-'){ arrs[r][c].text='-1'; }else if(text=='重新檢測'){ arrs[r][c].text='-2'; }else if(text=='無百度快照'||text=='無排名數據'){ arrs[r][c].text='-3' }else if(text == ''){ arrs[r][c].text='-4' }else{ arrs[r][c].text=table.rows[r].cells[c].innerText//取表格文字內容放進一個關聯數組裡面。用於下面的sort做排序。 } } } //alert(arrs[0][0]['text']) //reve判斷當前是正常排序還是反序; if(reve){ arrs.sort(function(x,y){ return parseFloat(y[s]['text']) - parseFloat(x[s]['text']) }); reve=0 }else{ arrs.sort(function(x,y){ return parseFloat(x[s]['text']) - parseFloat(y[s]['text'])//排序 }) reve=1 } //將排好的html內容放入表格裡 for(r = 0;r < row_len;r++){ for(c=0;c<cel_len;c++){ table.rows[r].cells[c].innerHTML =arrs[r][c]['html'] } } } //表格排序結束