簡體   English   中英

使用功能“排序”對javascript數組進行排序

[英]Sorting javascript array using function 'sort"

我正在嘗試對一個javascript數組進行排序,該數組包含任何類型的數據,例如數字,字符串,日期,時間等。我的邏輯適用於除數字以外的所有數據類型。 它正在考慮數字作為字符串。

例如,我有一個如下數組:

array = ["1","2","12","22","33","3"]

我期望排序后的數組將是1,2,3,12,22,33…但是它給出了: 1,12,2,22,3,33…

任何人都可以完善我的代碼,該代碼必須適用於任何類型的數據類型。

這是我的排序代碼:

function sortTable(a,b){
    if(sortMode=="A"){
    if(a[1]>b[1]) return 1;
        if(a[1]<b[1]) return -1;
    }
    else if( sortMode=="D"){
        if(a[1]>b[1]) return -1;
        if(a[1]<b[1]) return 1;
    }
    return 0;     
}
array.sort(sortTable);

注意:我無法預測數組中將包含哪種數據類型……因此排序功能必須是通用的。 意思是,我不能為不同的數據類型調用不同的排序技術函數……請確保排序函數應適用於所有數據類型。

無法獲得期望的輸出的原因是,當兩個操作數均為字符串類型時,會在它們之間進行字母比較。 它們不會自動轉換為數字。

"2" > "12" // result is true

如果操作數之一是數字,則比較運算符會將另一個操作數從字符串轉換為數字。

"2" > 12 // result is false

要指出的另一件事是,對於數字數組,您正在嘗試訪問索引為1的數組元素。

if(a[1]>b[1]) return 1;

應該是:

if( a > b ) return 1;

我將分別處理每個數據類型,而不是編寫這樣的泛型函數。

我寫了幾個正則表達式條件來檢查某些數據結構。 (您總是可以根據'typeof(a)'或'typeof(b)'做出分支的大型switch語句。)這些檢查確定是否應將字符串內的值解釋為字符串以外的其他值。

function sortVals(a,b){
    //other code here  
    var aT=a+"", bT=b+"";    //a and b as strings
    if(!aT.match(/[^0-9]/) && !bT.match(/[^0-9]/)){//no non-numbers were found
        a = parseInt(aT, 10);
        b = parseInt(bT, 10);
        if(a!=b)
            return a<b?1:-1;    //returns 1 if a<b; -1 if a>b
    }else if(!aT.match(/[^0-9\.]|\..*\./) && !bT.match(/[^0-9\.]|\..*\./)){//only valid floats were found
        a = parseFloat(aT);
        b = parseFloat(bT);
        if(a!=b)
            return a<b?1:-1;
    }
}

我不知道這是否是您想要的一部分,但是如果您想為任何數據類型使用排序功能,則需要在其中進行一些工作。 祝好運!

如前所述,您需要確定數據類型。 但是這是一個,您可以將其用於字符串/整數。

var sortMethod = function(x,y){
    var a = x|0 , 
        b = y|0; 
    return (a>b) ? 1 : -1;
});

var x = ["1", "34" , "3" , "12"].sort(sortMethod);
var y = [3,52,123,1].sort(sortMethod); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM