重複の可能性:
混合英数字配列の並べ替え
xxx1、xxx2、xxx3 の形式の要素を含む配列をソートしようとしています。Array.sort() メソッドは xxx9 まで正常に動作し、xxx10 または xxx11 という名前の要素がある場合は失敗します。順序は、xxx1、xxx10、xxx11、xxx2 などです。これを修正する方法を教えてください。
重複の可能性:
混合英数字配列の並べ替え
xxx1、xxx2、xxx3 の形式の要素を含む配列をソートしようとしています。Array.sort() メソッドは xxx9 まで正常に動作し、xxx10 または xxx11 という名前の要素がある場合は失敗します。順序は、xxx1、xxx10、xxx11、xxx2 などです。これを修正する方法を教えてください。
自然な文字列の並べ替えの結果が表示されています。文字列の並べ替えが必要ない場合は、独自のコンパレータを使用する必要があります。
次のようにします。
arrayToBeSorted.sort(function(first,second)
{
/* some code that compares 'first' with 'second' and returns <0, ==0, >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);
現時点では、配列がアルファベット順にソートされているため、これらの結果が得られます。数値ソートを実装するには、独自のコンパレータ関数を提供する必要があります。
試す
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"]