-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'、等进行排序,但是在资产代码之后的日期我想像真实日期时间一样排序,格式为 dd/mm/yyyy hh:mm:ss,而不是像'J01181'一根绳子。基本上,我想要的输出是:

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()函数允许您提供一个回调函数,该函数知道如何根据您希望实现的任何规则比较数组中的任何两项。

想到实现您的要求的最简单方法就是用 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;
});
于 2013-06-10T11:17:26.720 回答