问问题
1300 次
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 回答