2013-06-10 12 views
6

英数字の配列を次のようにソートする必要があります。 From:英数字ストリングの降順ソート

2 xxx 
20 axxx 
38 xxxx 
20 bx 
8540 xxxxxx 

に:

8540 xxxxx 
38 xxxx 
20 axxx 
20 bx 
2 xxx 

したがって、アルファベット昇順次に、数値に関して降順ソート。数字はアルファベットの文字( "xxxx"と表記)から常に1つのスペースで区切られますが、数字は可変長です。

私はsort()関数でいくつかのRegexを使い、スペースで数値を分割して並べ替える必要があると思うが、アルファベット順のソート方法を知らない。コードサンプル?本当にありがとう!

+0

は、これらの答えをチェックしますあなたがその解決策はOPを知っています: "http://stackoverflow.com/a/4340339/1375372 http://stackoverflow.com/a/11931192/1375372 http://stackoverflow.com/a/4340339/1375372 –

答えて

6

正規表現のための必要なしに、Array.sort()は、カスタム関数を受け入れるため:このような

http://jsfiddle.net/EFGK9/

var arr=["2 xxx","20 axxx","38 xxxx","20 bx","8540 xxxxxx"]; 
arr.sort(function(a,b){ 
    a=a.split(" "); 
    b=b.split(" "); 
    var an=parseInt(a[0],10); 
    var bn=parseInt(b[0],10); 
    return an<bn?1:(an>bn?-1:(a[1]<b[1]?-1:(a[1]>b[1]?1:0))); 
}); 
console.log(arr); 
+1

sort() 'はカスタム関数を受け取ります。その関数内で正規表現を使用することについては不思議に思っていました(あなたが指摘したように、 '.split()'で十分です。より複雑な入力フォーマットでは正規表現が必要になるかもしれません)。 – nnnnnn

+0

@Passerbyありがとう!それは完璧に動作します! – Wagtail

4

何かが動作します:

var arr = [ 
    "2 xxx", 
    "20 axxx", 
    "38 xxxx", 
    "20 bx", 
    "8540 xxxxxx" 
    ]; 

arr.sort(function(a, b) { 
    var aParts = a.split(" "), 
     bParts = b.split(" "), 
     aNum = +aParts[0], // convert numeric parts 
     bNum = +bParts[0]; // to actual numbers 

    if (aNum > bNum) 
     return -1; 
    else if (aNum < bNum) 
     return 1; 
    else 
     return aParts[1].localeCompare(bParts[1]); 
}); 

デモ:http://jsfiddle.net/KLa2J/

+0

ちょうど助言として、jsfiddleは私のために働いていません。私はこれが理論的にどのように動作すべきか分かりますが、split( "")関数には問題があるようです。とにかく良い答えをありがとう! – Wagtail

+1

あなたが受け入れた答えが同じテクニックを使用しているときに '.split(" ")'が問題を引き起こす原因となることはありません。あなたはIEの古いバージョンでフィドルをテストしようとしていないのですか?コンソールが実際に開かれていなければ古いIEにエラーを返す 'console.log()'ステートメントを含めましたが、それ以外の場合はうまくいきます。 – nnnnnn

+0

ああ、私は参照してください。 jsfiddleはChromeの最新バージョン – Wagtail

関連する問題