2

重複の可能性:
混合英数字配列の並べ替え

xxx1、xxx2、xxx3 の形式の要素を含む配列をソートしようとしています。Array.sort() メソッドは xxx9 まで正常に動作し、xxx10 または xxx11 という名前の要素がある場合は失敗します。順序は、xxx1、xxx10、xxx11、xxx2 などです。これを修正する方法を教えてください。

4

3 に答える 3

3

自然な文字列の並べ替えの結果が表示されています。文字列の並べ替えが必要ない場合は、独自のコンパレータを使用する必要があります。

次のようにします。

arrayToBeSorted.sort(function(first,second)
{ 
  /* some code that compares 'first' with 'second' and returns <0, ==0, >0*/ 
});
于 2012-11-05T11:32:17.347 に答える
0

コールバックにカスタムの並べ替え条件を実装して、以下に渡すことができますArray.sort()

​var arr = [],
    re = /^\D*(\d+)$/;

for(var i = 20; i-- > 0;) {
    arr.push('xxx' + i);
}

function comparator(a, b) {
    var numA = a.match(re)[1],
        numB = b.match(re)[1];
    return numA - numB;
}

arr.sort(comparator);
console.log(arr);
​

http://jsfiddle.net/f0t0n/qz62J/

于 2012-11-05T11:39:29.637 に答える
0

現時点では、配列がアルファベット順にソートされているため、これらの結果が得られます。数値ソートを実装するには、独自のコンパレータ関数を提供する必要があります。

試す

var arr = ["xxx1","xxx10","xxx2","xxx20","xxx3","xxx30"];

var sortedArr = arr.sort( function( a, b ) {

    // remove first 3 characters so remaining string will parse
    a = parseInt( a.substr( 3 ) );
    b = parseInt( b.substr( 3 ) );

    return a - b;
});

console.log( sortedArr ); // => ["xxx1", "xxx2", "xxx3", "xxx10", "xxx20", "xxx30"]
于 2012-11-05T11:36:36.713 に答える