js sort 二維數組排序的用法小結

最近在搞js 排序的問題,由於數據庫排序太耗資源,若是能轉移到客戶端去排序,能大大D減小服務器內存消耗。客戶端的話,除了js,就是as了,惋惜我as學得太爛,因此只能選擇js來研究研究了。。。通過個人測試,js內置方法sort的效率很是高php

咱們知道在js中默認提供了sort函數,可是這個函數默認是按照數組內容的ascii碼升序進行排列的,若是咱們要對二維數組排序要如何作呢?在php中是有multi_sort函數可供調用的,可是在js中彷佛沒有這種函數,可是不要緊 ,由於js的sort函數其實也提供了參數能夠定義比較函數進行二維數組的排序。html

一、按數值排序
假設有以下數組c++

複製代碼代碼以下:

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就是按第一列升序的數組了。數組

 

二、按字符串排序
按字符串排序的話呢,咱們能夠利用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']                         }                     }             }         //表格排序結束
相關文章
相關標籤/搜索