按资产代码子字符串JAVASCRIPT排序后按datetime子字符串排序

时间:2013-06-10 11:03:59

标签: javascript sorting date-sorting

我想对字符串数组进行排序:

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

1 个答案:

答案 0 :(得分:2)

.sort() function允许您提供一个回调函数,该函数知道如何根据您要实现的规则比较数组中的任何两个项目。

实现您的要求时想到的最简单的方法就是用yyyymmdd替换dd / mm / yyyy日期格式,因为这样就可以使用标准的字母数字排序,并且不需要实际创建日期对象或任何东西。 (这个替换实际上并没有改变数组中的项目,我只是想在一些工作变量中进行替换以进行排序比较。)所以:

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;
});