我想对字符串数组进行排序:
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
答案 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"));
});
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;
});