JavaScript函數補完:sort()排序

2021-03-02 野狗


JavaScript實現多維數組、對象數組排序,其實用的就是原生的sort()方法,用於對數組的元素進行排序。

sort() 方法用於對數組的元素進行排序。語法如下:

arrayObject.sort(sortby)

返回值為對數組的引用。請注意,數組在原數組上進行排序,不生成副本。

如果調用該方法時沒有使用參數,將按字母順序對數組中的元素進行排序,說得更精確點,是按照字符編碼的順序進行排序。要實現這一點,首先應把數組的元素都轉換成字符串(如有必要),以便進行比較。

如果想按照其他標準進行排序,就需要提供比較函數,該函數要比較兩個值,然後返回一個用於說明這兩個值的相對順序的數字。比較函數應該具有兩個參數 a 和 b,其返回值如下:

function NumAscSort(a,b)

{

    return a - b;

}

function NumDescSort(a,b)

{

    return b - a;

}

var arr = new Array( 3600, 5010, 10100, 801); 

arr.sort(NumDescSort);

alert(arr);

arr.sort(NumAscSort);

alert(arr);

sort(fun)接受了個排序規則函數,這個函數將比較2個數字的大小。而我們的對象數組排序,實際上原理也是一樣的。

如果不比較數字的大小,則可以這樣:

var myarray=["Apple", "Banana", "Orange"]

myarray.sort()

數組直接調用sort()後,數組按字母順序對數組中的元素進行排序,說得更精確點,是按照字符編碼的順序進行排序。

對於對象數組排序,我們先寫一個構造比較函數的函數:

//by函數接受一個成員名字符串做為參數

//並返回一個可以用來對包含該成員的對象數組進行排序的比較函數

var by = function(name){

    return function(o, p){

        var a, b;

        if (typeof o === "object" && typeof p === "object" && o && p) {

            a = o[name];

            b = p[name];

            if (a === b) {

                return 0;

            }

            if (typeof a === typeof b) {

                return a < b ? -1 : 1;

            }

            return typeof a < typeof b ? -1 : 1;

        }

        else {

            throw ("error");

        }

    }

}

要排序的數組:

var employees=[]

employees[0]={name:"George", age:32, retiredate:"March 12, 2014"}

employees[1]={name:"Edward", age:17, retiredate:"June 2, 2023"}

employees[2]={name:"Christine", age:58, retiredate:"December 20, 2036"}

employees[3]={name:"Sarah", age:62, retiredate:"April 30, 2020"}

直接調用函數:

employees.sort(by("age"));

到這裡,對象數組排序就算基本實現了。那如何實現多個鍵值排序呢?意思就是先是對age排序,如果age相同,再比較name。

這時,我們可以進一步修改by函數,讓其可以接受第二個參數,當主要的鍵值產生一個匹配的時候,另一個compare方法將被調用以決出高下。

//by函數接受一個成員名字符串和一個可選的次要比較函數做為參數

//並返回一個可以用來包含該成員的對象數組進行排序的比較函數

//當o[age] 和 p[age] 相等時,次要比較函數被用來決出高下

var by = function(name,minor){

    return function(o,p){

        var a,b;

        if(o && p && typeof o === 'object' && typeof p ==='object'){

            a = o[name];

            b = p[name];

            if(a === b){

                return typeof minor === 'function' ? minor(o,p):0;

            }

            if(typeof a === typeof b){

                return a < b ? -1:1;

            }

            return typeof a < typeof b ? -1 : 1;

        }else{

            thro("error");

        }

    }

}

  

employees.sort(by('age',by('name')));

好了,現在可以放心使用了。如果看不懂,可直接copy 這個by函數到你的應用裡面,直接調用即可。



原文:http://www.nowamagic.net/librarys/veda/detail/1715



這裡,了解野狗!

相關焦點

  • C sort 排序函數用法
    最近在刷ACM經常用到排序,以前老是寫冒泡,可把冒泡帶到OJ裡後發現經常超時,所以本想用快排,可是很多學長推薦用sort函數,因為自己寫的快排寫不好真的沒有
  • C++ sort 排序函數用法
    ,以前老是寫冒泡,可把冒泡帶到OJ裡後發現經常超時,所以本想用快排,可是很多學長推薦用sort函數,因為自己寫的快排寫不好真的沒有sort快,所以毅然決然選擇sort函數用法1、sort函數可以三個參數也可以兩個參數,必須的頭文件#include < algorithm>和using namespace std;2、它使用的排序方法是類似於快排的方法,時間複雜度為n
  • Excel – 多條件排序就用 sortby 函數
    O365 這次出了兩個排序函數,除了前段時間給大家講解過的 sort 以外,還有一個 sortby 函數。sortby 函數也是用於排序,功能跟 sort 類似,主要區別在於:有關 sort 函數的詳解,請參閱 Excel – 告別繁瑣的菜單操作
  • 淺談JavaScript 中 sort( ) 排序的坑
    基本排序JS 中的 Array 對象有一個排序方法 sort( ),調用它的運行結果一般來說是這樣的:甚至當數組中出現未定義值的元素時 sort( ) 也同樣好用。文檔中有這樣一句話:「所有未定義的數組元素都會被轉化成字符串,並通過比較 UTF-16 的值來進行排序。」
  • 從 JavaScript 到 Go 語言的排序算法
    由於與 JS 數組不同,Go 切片沒有開箱即用的方法,我們沒辦法直接使用已有的排序算法,我們需要導入 sort 包並使用其 Sort 函數來對數組重新排列。讓我們試試吧!它的函數籤名實際上是這樣的:func Sort(data Interface)sort.Interface(帶有一個大 I)是一個 Go 接口,表示可以排序的數據集合,如字符串、數字抑或是結構體列表。
  • Excel – 告別繁瑣的菜單操作,用 sort 函數排序
    今天再給大家介紹 O365 的一個新函數 sort,毫不誇張地說,在 Excel 升級到新版本之前,sort 是我最為期待的新函數之一。以下操作原本都要通過菜單來實現,自從 sort 函數問世之後,簡直太方便了:對某一列排序按照某一列,對整個數據表排序對任意部分列排序
  • Pandas學習之旅:排序函數sort_values()
    pandas中的sort_values()函數原理類似於SQL中的order by,可以將數據集依照某個欄位中的數據進行排序,該函數即可根據指定列數據也可根據指定行的數據排序
  • python中排序函數sort,sorted和operator.itemgetter的使用
    1.sort    sort()是Python列表的一個內置的排序方法,list.sort()
  • Python 列表排序 sort 與 sorted 詳解
    與 sorted 是 Python 內置的列表排序函數。sort使用 list.sort() 會將 list 進行升序排序,返回 NoneType ,影響 list 本身,如In [8]: li=[1,5,3,2]In [9]: li.sort()In [10]: liOut[10]: [1, 2, 3, 5]In [11
  • LeetCode | 實現排序比較函數 | Relative Sort Array
    https://leetcode.com/problems/relative-sort-array/
  • JavaScript實現九種排序算法
    原理圖:代碼:// 冒泡排序 每次將最小元素推至最前function sort4(array) { var len = array.length,以前公司項目中對比過二分插入排序、優化冒泡排序、快速排序的JS實現執行時間,幾千條數據的數組在firefox下快速排序的速度比冒泡、插入排序快3至4秒(數組元素為複雜的對象,根據對象某一屬性值排序)。阮一峰老師研究JS實現排序時曾只針對該種排序進行講解:javascript的快速排序實現**。
  • Sort an Array 數組排序
    ,在平時刷其他題的時候,遇到要排序的時候,一般都會調用系統自帶的排序函數,像 C++ 中直接就調用 sort 函數即可,但是這道題考察的就是排序,再調用系統的排序函數就有些說不過去了。這裡需要自己實現排序功能,常見排序方法有很多,插入排序,選擇排序,堆排序,快速排序,冒泡排序,歸併排序,桶排序等等。它們的時間複雜度不盡相同,這道題貌似對於平方級複雜度的排序方法會超時,所以只能使用那些速度比較快的排序方法啦。
  • 關於 JavaScript 的數組隨機排序
    (點擊上方藍字,快速關注我們)作者:oldjblog.oldj.net/2017/01/23/shuffle-an-array-in-javascript
  • 我用Python之sort排序
    大學C語言編程課上,老師只介紹了最符合直觀思維,效率很低的冒泡排序,經典的快速排序也沒介紹(不過這不是老師的錯,修行在個人)。C++ 的標準模板類庫 STL 提供了快速排序函數 qsort 。但為了實現對自定義類、結構體的排序操作,通常需要自己另寫比較函數,代碼量較大,編程效率較低。「人生苦短,我用Python「。
  • JavaScript 排序算法指南
    英文 | https://blog.bitsrc.io/a-guide-to-sorting-algorithms-in-javascript在這篇文章中,我們將使用排序算法對數組進行排序。JavaScript 中至少有 8 種不同的排序算法。為了使這篇文章簡短但仍然充滿有用的知識,我將重點介紹以下4種算法:冒泡排序算法是一種非常常見的算法,通常是計算機科學課程中最先教授的內容之一。這是因為冒泡排序的工作方式與我們人類對項目進行排序的方式非常相似。讓我們從創建一個名為 bubbleSort 的函數開始。
  • JavaScript 處理數組函數的總結
    8、重排序方法:sort和reservesort()可以對當前Array進行排序,它會直接修改當前Array的元素位置,直接調用時,按照默認順序(將按字母順序對數組中的元素進行排序)排序:var arr = ['c','b','a','C','B','A'];arr.sort();arr;//['A'
  • JavaScript數組 - 系統排序
    系統排序排序的方法有很多,有逆向排序、冒泡排序、選擇排序、快速排序等我們先來看一下系統排序的方法1.reverse( ); 逆向排序格式:數組.reverse();舉個小例子:將10,20,30,40逆向排序
  • python實踐分享:關於排序算法,怎麼選擇sort()或者sorted()?
    各種排序算法以及它們的時間複雜度分析是很多企業面試人員在面試時候經常會問到的問題,這也不難理解,在實際的應用過程中確實會遇到各種需要排序的情況,如按照字母表輸出一個序列、對記錄的多個欄位排序等。還好,Python中的排序相對簡單,常用的函數有 sort()和sorted()兩種。這兩種函數並不完全相同,各有各的用武之地。
  • 內置排序方法-sorted和sort
    sorted(iterable, key=None, reverse=False) 和 reversed(iterable)函 數可以處理任何可迭代對象,返回一個排序或反轉的迭代器
  • 深入理解快速排序和 STL 的 sort 算法
    SGI STL中的sort的參數是兩個隨機存取迭代器RandomAccessIterator,sort的模板也是基於此種迭代器的,因此如果容器不是隨機存取迭代器,那麼可能無法使用通用的sort函數。從代碼來看sort使用了first和last兩個隨機存取迭代器,作為待排序序列的開始和終止,進一步調用了__introsort_loop和__final_insertion_sort兩個函數,從字面上看前者是內省排序循環,後者是插入排序