2011-02-08 12 views
0

"結果"という2次元配列があります。結果の各「行」配列には、文字列と整数の両方の値が含まれます。私はこのスクリプトを使用して、配列をonclickイベントの "列"でソートしています。多次元配列をJavascriptで並べ替える:整数

function sort_array(results, column, direction) { 
var sorted_results = results.sort(value); 
function value(a,b) { 
    a = a[column]; 
    b = b[column]; 
    return a == b ? 0 : (a < b ? -1*direction : 1*direction) 
    } 
} 

これは文字列の列でうまくいきます。しかし、数値の代わりに文字列のような整数の列を扱います。たとえば、「昇順」または97,200,15,1000の「降順」の場合、値15,1000,200,97は1000,15,200,97にソートされます。

タイプの整数値を再確認しました。スクリプトは数字であることを認識しています。どうやってそれらを扱うことができますか?

答えて

1

関数が返す値を決定する比較の型にaとbの型を設定します。このプロセスでは、文字列を基準に整数をソートする方法を決定する必要があります。

また、値を受け取り、すべての桁の文字列を固定長の文字列で置き換え、先頭に0を付けて文字列の比較を行う比較関数を使用できます。このアプローチの利点は、あなたが "a2"、 "a9"、 "a10"などのようなものを並べ替えることです。

0

あなたは数字であると確信していますか?あなたはどのようにチェックしましたか?念の数字であることを、それらを強制的にこの変更をお試しください:

if (isNumberColumn(column)) { 
    a = +a; 
    b = +b; 
} 
0

私はあなたがソートする前に列の値を超える予備パスを作成する必要があるとしていると思います。どうして?すべての値を数値として扱うことができるかどうかを事前に(ソート前に)知る必要があります。可能であれば、 "value"関数はそれらを変換することができます。それ以外の場合は、文字列としてソートする必要があります。

0

自分のニーズに合った独自の比較機能を作成できます。文字列とintを比較する独自の方法を定義できます。例:

function getDirection(a,b){ 
    if(typeof(a) == typeof(b)) 
     return a == b ? 0 : (a>b?1:-1); 
    a+="";b+=""; 
    if(a[0] == '-') 
     { 
      if(b[0] != '-') 
       return 1; 
     } 
    else 
     if(b[0] != '-') 
      return -1; 
    return a[0] == b[0] ? 0 : (a[0]>b[0]?1:-1); 
} 

希望します。

0

最初に:ソートはミューテータであり、並べ替えが行われることを意味します。もちろん、あなたはそれが場所でソートたいが、その後、あなたがsorted_results変数を何が必要なのですかない限り、意図しないconsequecesを避けるために、私は

var sorted_results = results.slice(0).sort(value); 

var sorted_results = results.sort(value); 

を変更するだろうか?

ソート自体については、整数の並べ替えがうまくいくようですが、問題は実際には整数と文字列の混在したシナリオの文字列です。例:http://jsfiddle.net/QJ5fM/異なっ:

1,12,0hey,aa,hey,16,100,131,176 
1,12,0hey,16,100,131,176,aa,hey 
1,12,16,100,131,176,0hey,aa,hey 

Firefox 3の次クローム9で次のような結果を与える

[[16],[131],['aa'],['0hey'],[176],[100],['hey'],[1],[12]]; 
[['aa'],[16],[131],['0hey'],[176],[100],['hey'],[1],[12]]; 
[['aa'],['0hey'],[16],[131],[176],[100],['hey'],[1],[12]]; 

。6:

1,12,0hey,aa,hey,16,100,131,176 
1,12,0hey,hey,16,100,131,176,aa 
1,12,hey,16,100,131,176,0hey,aa 

とIE8で、次のP

:ここでは驚きと

0hey,aa,hey,1,12,16,100,131,176 
0hey,aa,hey,1,12,16,100,131,176 
0hey,aa,hey,1,12,16,100,131,176 

、実装、IE8は正気、または少なくとも一貫したのみを持っているようです