6

Javascript では、次のような配列の配列があるとします。

X = [ [1,2,3,4],
      [1,1,2,3],
      [1,1,3],
      [1,4],
      [2,1,2],
      [2,2]
    ]

Javascript は配列をソートし、最初のエントリを最初に比較し、次に 2 番目というように比較するためX.sort()、次の結果が返されます。

[ [1,1,2,3],
  [1,1,3],
  [1,2,3,4],
  [1,4],
  [2,1,2],
  [2,2]
]

それが私が欲しいものです。問題は、配列内の要素を比較するための比較演算子が辞書式であるため[10,2] < [2,2]、たとえば、

[[10,2],[1,1,3],[2,2]].sort() -> [[1,1,3],[10,2],[2,2]]

のソートされた配列を取得するために、数値でソートする必要があり[[1,1,3],[2,2],[10,2]]ます。

の比較関数を使用してみましたがfunction(a,b){return (a-b) }、これは数値の配列をソートするために機能しますが、これは配列を適切にソートできません[10,2] - [1,1,3]NaN

数値配列の配列をソートするにはどうすればよいですか?

4

5 に答える 5

7

コメントで述べたように、sort関数は、引数としてプレーンな値ではなく配列を受け取っているという事実を説明する必要があります。したがって、それに応じてそれらを処理する必要があります。

私はこれを提案します。

var compFunc = function (a, b) {
    var len = a.length > b.length ? b.length : a.length;

    for(var i=0; i<len; ++i) {
        if(a[i] - b[i] !== 0)
            return a[i] - b[i];
    }

    return (a.length - b.length);
};

最初に、2 つの配列の共通の長さの違いを探します。共通の長さがまったく同じ場合は、配列の長さに基づいて並べ替えます。これが実用的なフィドルです。

于 2013-03-28T15:48:48.357 に答える
1

あなたが望むのは、自然なソートを実行することです。比較関数については、この記事に記載されているスクリプトに置き換えます

http://my.opera.com/GreyWyvern/blog/show.dml/1671288

于 2013-03-28T15:31:03.107 に答える
1

するとX.sort()、Javascript は個々の配列を文字列として比較します。基本的にやっていa.toString().localeCompare(b.toString())ます。これはあなたが望むものではありません。

a.toString()通常は同じですa.join(',')

私なら、for ループを使用して配列内の各要素を比較します。

このようなもの:

X.sort(function(a,b){
    // Start off assuming values are equal
    var ret = 0;

    // Loop through a
    for(var a_i = 0, a_length = a.length; a_i < a_length; a_i++){
        // If b is shorter than a, it comes first
        if(typeof b[a_i] === 'undefined'){
            ret = 1;
            break;
        }
        // if the element in a and b are *not* the same, then we can sort
        else if(a[a_i] !== b[a_i]){
            ret = a[a_i] - b[a_i];
            break;
        }
    }

    return ret;
});
于 2013-03-28T15:40:43.603 に答える
0

2 つの配列を並べ替えて比較する必要があります: http://jsfiddle.net/pXzB6/

var arr = [[10,2],[1,1,3],[2,2]];

arr.sort(function(a,b){
    for(var i=0;i<a.length;i++){
       var item_a = a[i];
       for(var j=0;j<b.length;b++){   
           var item_b = b[j];   
           if(item_a == item_b){
                 continue;
           }
           else{
               return item_a > item_b;
           }
       }
    }

    if(a.length == b.length){
       return 0;
    }
    else{
      return a.length > b.length;
    }
});

console.log(arr);
于 2013-03-28T15:43:01.583 に答える