0
4

3 に答える 3

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); 
于 2012-09-30T04:13:58.953 に答える
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;
    }
}

これが必要なものの一部であるかどうかはわかりませんが、任意のデータ型の並べ替え関数が必要な場合は、それに何らかの作業を加える必要があります。幸運を!

于 2012-08-17T13:51:59.793 に答える
1

期待する出力が得られない理由は、両方のオペランドが文字列型の場合、それらの間でアルファベット順の比較が行われるためです。それらは自動的に数値に変換されません。

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

オペランドの 1 つが数値の場合、比較演算子はもう一方のオペランドを文字列から数値に変換します。

"2" > 12 // result is false

指摘すべきもう 1 つの点は、数値の配列の場合、インデックス 1 の配列要素にアクセスしようとしていることです。

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

これは次のようになります。

if( a > b ) return 1;

このような汎用関数を作成するのではなく、各データ型を個別に処理します。

于 2012-08-17T11:38:56.223 に答える