2015-01-15 63 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