使用函数“sort”对javascript数组进行排序

Sorting javascript array using function 'sort"

本文关键字:数组 javascript 排序 函数 sort      更新时间:2023-09-26

我正在尝试对一个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)"是什么进行分支。这些检查确定字符串中的值是否应解释为字符串以外的内容。

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);