-5

文字列の配列をソートしたい:

J01171 01/02/2013 18:12:43 J01171 Bath Rd Ipswich Isolated by OTU Fault   
J01171 01/02/2013 18:42:32 J01171 Bath Rd Ipswich Reconnected   
J01171 01/11/2012 08:04:34 J01171 Bath Rd Ipswich Isolated by OTU Fault   
J01171 01/11/2012 08:04:47 J01171 Bath Rd Ipswich Reconnected   
J01171 02/01/2013 15:46:22 J01171 Bath Rd Ipswich Isolated by OTU Fault   
J01171 02/01/2013 15:46:36 J01171 Bath Rd Ipswich Reconnected  
J01181 09/02/2013 00:43:00 J01181 BathRd LeighRd Isolated by OTU Fault    
J01181 09/02/2013 00:47:57 J01181 BathRd LeighRd Reconnected    
J01181 10/12/2012 13:13:13 J01181 BathRd LeighRd Isolated by Fault   
J01181 10/12/2012 15:30:01 J01181 BathRd LeighRd Reconnected  

現在、通常の array.sort() JavaScript 関数を使用して文字列の配列を並べ替えると、すべての行が文字列として並べ替えられるため、数値は日付ではなく数値順になります。私が望むのは、資産コード'J01171''J01181'などを通常の文字列としてソートし続けることですが、資産コードの後に​​来る日付は、実際の日付時刻のように dd/mm/yyyy hh:mm:ss のようにではなくソートしたいと思います。文字列の部分。基本的に、私が望む出力は次のとおりです。

J01171 01/11/2012 08:04:34 J01171 Bath Rd Ipswich Isolated by OTU Fault   
J01171 01/11/2012 08:04:47 J01171 Bath Rd Ipswich Reconnected   
J01171 02/01/2013 15:46:22 J01171 Bath Rd Ipswich Isolated by OTU Fault   
J01171 02/01/2013 15:46:36 J01171 Bath Rd Ipswich Reconnected  
J01171 01/02/2013 18:12:43 J01171 Bath Rd Ipswich Isolated by OTU Fault  
J01171 01/02/2013 18:42:32 J01171 Bath Rd Ipswich Reconnected   
J01181 10/12/2012 13:13:13 J01181 BathRd LeighRd Isolated by Fault    
J01181 10/12/2012 15:30:01 J01181 BathRd LeighRd Reconnected     
J01181 09/02/2013 00:43:00 J01181 BathRd LeighRd Isolated by OTU Fault     
J01181 09/02/2013 00:47:57 J01181 BathRd LeighRd Reconnected
4

1 に答える 1

2

この.sort()関数を使用すると、実装したいルールに従って、配列内の任意の 2 つの項目を比較する方法を知っているコールバック関数を提供できます。

要件を達成するために頭に浮かぶ最も簡単な方法は、dd/mm/yyyy 日付形式を yyyymmdd に置き換えることです。これにより、標準の英数字の並べ替えが機能し、実際に日付オブジェクトなどを作成する必要がなくなります。(この置換は、実際には配列内の項目を変更しません。並べ替え比較のために、いくつかの作業変数を置換することを意味します。)

var arr = [
    "J01171 01/02/2013 18:12:43 J01171 Bath Rd Ipswich Isolated by OTU Fault",
    "J01171 01/02/2013 18:42:32 J01171 Bath Rd Ipswich Reconnected",
    etc.
];

var regex = /^([^ ]+ )(\d\d)\/(\d\d)\/(\d{4})/;

arr.sort(function(a, b) {
    return a.replace(regex,"$1$4$3$2").localeCompare(b.replace(regex,"$1$4$3$2"));
});

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

コールバック内で使用される正規表現ベースの置換sort()により、比較対象の各項目が次の形式に変換されます。

J01171 20130201 18:12:43 J01171 Bath Rd Ipswich Isolated by OTU Fault

次に.localeCompare()、アイテムの各ペアに対して標準的な英数字の比較を行います。それを行うためのより長いが、おそらくより明確な方法は次のとおりです。

arr.sort(function(a, b) {
    a = a.replace(regex,"$1$4$3$2");
    b = b.replace(regex,"$1$4$3$2");
    if (a > b)
       return 1;
    else if (a < b)
       return -1;
    else
       return 0;
});
于 2013-06-10T11:17:26.720 に答える