0
4

3 回答 3

1

我写了几个检查某些数据结构的正则表达式条件。(你总是可以只做一个大的 switch 语句,根据 '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;
    }
}

我不知道这是否是你想要的一部分,但如果你想要任何数据类型的排序函数,你需要做一些工作。祝你好运!

于 2012-08-17T13:51:59.793 回答
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); 
于 2012-09-30T04:13:58.953 回答
1

您没有得到您期望的输出的原因是当两个操作数都是字符串类型时,它们之间会按字母顺序进行比较。它们不会自动转换为数字。

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

如果其中一个操作数是数字,则比较运算符会将另一个操作数从字符串转换为数字。

"2" > 12 // result is false

需要指出的另一件事是,在数字数组的情况下,您正试图访问索引 1 处的数组元素。

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

这应该是:

if( a > b ) return 1;

我会分别处理每种数据类型,而不是编写这样的通用函数。

于 2012-08-17T11:38:56.223 回答