Javascript陣列排序sort方法和自定義排序方法

風靈使發表於2018-05-26

前言

針對一個陣列進行排序,一個很常見的需求.尤其在後端.當然,前端也是有這個需求的.

當然,陣列排序,是有現成的方法的.就是sort()方法.

我們先開看下這個.

標準答案,sort方法

var arr = [45,98,67,57,85,6,58,83,48,18];
console.log('原陣列');
console.log(arr);
console.log('sort方法從小到大排序');
console.log(arr.sort(function(a,b){return a-b}));
console.log('sort方法從大到小排序');
console.log(arr.sort(function(a,b){return b-a}));

執行結果如下:
sort方法陣列排序

這裡需要注意的是,sort預設是按照字母順序來進行排序的.因此,我們在排列數字的時候,需要一個自定義函式.

如上面的程式碼

function(a,b){return a-b}

這就是一個從小到大的排序函式.看上去好簡單的樣子,但是我不理解,所以,我根據我的想法,來實現排序吧~

我的答案,for方法排序

var arr = [45,98,67,57,85,6,58,83,48,18];
console.log('原陣列');
console.log(arr);
console.log('for方法從小到大排序');
console.log(arrSortMinToMax(arr));
console.log('for方法從大到小排序');
console.log(arrSortMaxToMin(arr));
// 找陣列中最小的值
function arrMinNum(arr){
    var minNum = Infinity, index = -1;
    for (var i = 0; i < arr.length; i++) {
        if (arr[i]<minNum) {
            minNum = arr[i];
            index = i;
        }
    };
    return {"minNum":minNum,"index":index};
}
// 返回陣列從小到大排序結果
function arrSortMinToMax(arr){
    var arrNew = [];
    var arrOld = arr.concat();
    for (var i = 0; i < arr.length; i++) {
        arrNew.push(arrMinNum(arrOld).minNum);
        arrOld.splice(arrMinNum(arrOld).index,1)
    };
    return (arrNew);
}
// 找陣列中最大的值
function arrMaxNum(arr){
    var maxNum = -Infinity, index = -1;
    for (var i = 0; i < arr.length; i++) {
        if (arr[i]>maxNum) {
            maxNum = arr[i];
            index = i;
        }
    };
    return {"maxNum":maxNum,"index":index};
}
// 返回陣列從大到小排序結果
function arrSortMaxToMin(arr){
    var arrNew = [];
    var arrOld = arr.slice(0);
    for (var i = 0; i < arr.length; i++) {
        arrNew.push(arrMaxNum(arrOld).maxNum);
        arrOld.splice(arrMaxNum(arrOld).index,1);
    };
    console.log(arr)
    return (arrNew);
}

執行結果如下圖所示

for迴圈陣列排序結果

我的方法中的知識點

  1. 當一個函式需要返回多條資料的時候,使用json物件格式比較方便.如上面的return
    {"minNum":minNum,"index":index};
  2. 如果使用 var arrOld = arr 這種方法來複制一個陣列,並且,對arrOld進行操作的話,是會影響到arr這個原陣列的.因為javascript分原始型別與引用型別(與java、c#類似)。Array是引用型別。arrOld得到的是引用,所以對arrOld的修改會影響到arr。

    • 複製陣列的方法(一)var arrOld = arr.concat(); ,原理:concat()函式是用於拼接多個陣列的函式,這種寫法相當於拼接自己.也就是複製了.
    • 複製陣列的方法(二)var arrOld = arr.slice(0) , 原理:slice()函式是一個擷取陣列的函式,設定值為0,則是全部擷取,相當於複製了.
  3. splice()方法用於插入、刪除或替換陣列的元素。這裡是使用了其刪除陣列中指定位置的特性.

  4. 我的方法和sort方法的差異.
    • 我的方法沒有修改原陣列,而sort是在原陣列的基礎上進行的修改.
    • 我的方法返回的是一個新陣列,原陣列並沒有消失或者改變.(好像和上面一句是一個意思….)
  5. 排序是程式設計中非常非常基礎並且非常非常重要的知識點.sort排序在執行大量資料的情況下,效率還是比較低的.當然,我的方法的效率也是很低的.

相關文章