2015-01-15 25 views
2

我想用js对一个对象数组进行排序。这是我实施的。在数组中排序日期字符串

var employees = [] 
employees[0] = { 
    retiredate: "01/12/2014" 
} 
employees[1] = { 
    retiredate: "29/01/2015" 
} 
employees[2] = { 
    retiredate: "05/12/2014" 
} 
employees[3] = { 
    retiredate: "08/12/2014" 
} 
employees[4] = { 
    retiredate: "11/12/2014" 
} 
employees[5] = { 
    retiredate: "14/01/2015" 
} 
employees[6] = { 
    retiredate: "03/12/2014" 
} 
employees[7] = { 
    retiredate: "16/01/2015" 
} 
employees[8] = { 
    retiredate: "19/01/2015" 
} 
employees[9] = { 
    retiredate: "22/01/2015" 
} 
employees[10] = { 
    retiredate: "28/01/2015" 
} 
employees[11] = { 
    retiredate: "23/01/2015" 
} 
employees[12] = { 
     retiredate: "15/01/2015" 
    } 
    //console.log(periodesSorted); 

console.log("START ... ") 
employees.sort(function(a, b) { 
    var dateA = new Date(a.retiredate), 
     dateB = new Date(b.retiredate) 
    return dateA - dateB //sort by date ascending 
}) 

for (ind2 = 0; ind2 < employees.length; ind2++) { 
    console.log(employees[ind2].retiredate) 
} 
console.log("End ... ") 

在firefox中,退休人员数组排序良好。

在Chrome中,我有以下结果

01/12/2014 
15/01/2015 
05/12/2014 
08/12/2014 
11/12/2014 
14/01/2015 
29/01/2015 
16/01/2015 
19/01/2015 
22/01/2015 
28/01/2015 
23/01/2015 
03/12/2014 

结果进行排序。代码中哪里出错了? 任何人都可以提出一个解决这个问题吗?

问候

+0

不能产生从DD/MM/YYYY格式的字符串为有效日期; '03/12/2014'将导致3月12日,'23/01/2015'无效。使用mm/dd/yyyy格式。 –

+0

你可以通过将日期转换为一个整数来表示日期,该整数表示日期在1.1.1970和实际日期之间 - 然后让一个排序算法完成剩余的 - 然后将它们转换回 – Ba5t14n

回答

1

取而代之的是:

new Date(a.retiredate) 

使它像这DD/MM/YYYY转换为YYYY-MM-DD创建日期前:

new Date(a.retiredate.replace(/(\d{2})\/(\d{2})\/(\d{4})/, "$3-$2-$1")); 

工作JSFiddle: http://jsfiddle.net/inanda/csz56b0q/1/

+1

我建议替换为'$ 3 - $ 2- $ 1',因为这使它成为ISO 8601格式,这被证明是受支持的。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date – Guffa

+0

好的。改变完成了。 –

1

在我们的情况下,您需要转换牛逼的日期格式mm/dd/yyyy,你可以做这样的

employees.sort(function(a, b) { 
    var toDate = function (date) { 
    var res = date.split('/'); 
    return new Date(res[2], res[1], res[0]).getTime(); 

    // getTime returns the number of milliseconds 
    // or you can use + before new Date.. 
    }; 

    return toDate(a.retiredate) - toDate(b.retiredate); 
}) 

Example

0

个人而言,我会避免全部重新解析&日期建设(你的样品中84次);

// prepare the data by appending a date from a reformatted string 
for (var i = 0; i < employees.length; i++) { 
    var dateString = employees[i].retiredate; 
    employees[i]._date = new Date(dateString.substr(6, 4) + "-" + dateString.substr(3, 2) + "-" + dateString.substr(0, 2)); 
} 

// sort without conversion 
employees.sort(function(a, b) { 
    return a._date - b._date; 
}) 
1

您可以使用

employees.sort(function (d1, d2) { 
    function parseDate(str) { 
    var parts = str.match(/(\d+)/g); 
    // assumes M/D/Y date format 
    return new Date(parts[2], parts[0]-1, parts[1]); // months are 0-based 
    } 
    return parseDate(d1.retiredate) - parseDate(d2.retiredate); 
}); 

这里例如Link