[英]Sort javascript object based on date keys
我有一個如下所示的 JavaScript 對象
testObj = {
1/10/2015: {},
2/10/2015: {},
3/10/2015: {},
4/10/2015: {},
29/09/2015: {},
30/09/2015: {}
}
現在,我正在嘗試對此進行排序,以便日期按日期按遞增順序排列。 為此,我做了以下工作
const orderedDates = {};
Object.keys(testObj).sort(function(a, b) {
return moment(moment(b, 'DD/MM/YYYY') - moment(a, 'DD/MM/YYYY')).format('DD/MM/YYYY');
}).forEach(function(key) {
orderedDates[key] = testObj[key];
})
rangeObj = orderedDates;
然而,這根本不是對日期進行排序。 它仍然返回與testObj
完全相同的對象。 如何根據日期鍵對對象進行排序?
這一行返回一個字符串:
moment(moment(b, 'DD/MM/YYYY') - moment(a, 'DD/MM/YYYY')).format('DD/MM/YYYY')
但是sort方法需要一個整數值,因此您需要比較實際日期:
Object.keys(testObj).sort(function(a, b) {
return moment(b, 'DD/MM/YYYY').toDate() - moment(a, 'DD/MM/YYYY').toDate();
}).forEach(function(key) {
orderedDates[key] = testObj[key];
})
但是,您需要注意,在 ES5 中,對象中鍵的順序不受規范保證 - 盡管大多數瀏覽器確實按插入順序迭代鍵。 然而,在 ES6 中,你可以保證,如果你迭代你的對象鍵,它們將是有序的。
所以console.log(orderedDates)
可能不會按照你預期的順序顯示鍵,但是Object.keys(orderedDates).forEach(function(date) { console.log(date); });
將按預期工作。
var testObj = { "1/10/2015": {}, "2/10/2015": {}, "3/10/2015": {}, "4/10/2015": {}, "29/09/2015": {}, "30/09/2015": {} }; var orderedDates = {}; Object.keys(testObj).sort(function(a, b) { return moment(b, 'DD/MM/YYYY').toDate() - moment(a, 'DD/MM/YYYY').toDate(); }).forEach(function(key) { orderedDates[key] = testObj[key]; }) Object.keys(orderedDates).forEach(function(date) { document.body.innerHTML += date + "<br />" });
<script src="http://momentjs.com/downloads/moment.js"></script>
Without moment library you can also do. It will work for all js framework
var testObj = {
"3/10/2015": {},
"2/10/2015": {},
"1/10/2015": {},
"4/10/2015": {},
"29/09/2015": {},
"30/09/2015": {}
};
var ordered = {};
Object.keys(testObj).sort(function(a, b) {
return (dateConverter(a) - dateConverter(b));
}).forEach(function(key) {
ordered[key] = testObj[key];
});
/* Convert DD/MM/YY to date object */
function dateConverter(date) {
var dateParts = date.split("/");
var dateObject = new Date(+dateParts[2], dateParts[1] - 1, +dateParts[0]);
return dateObject
}
/* ordered return now
"1/10/2015": {},
"2/10/2015": {},
"3/10/2015": {},
"4/10/2015": {},
"29/09/2015": {},
"30/09/2015": {} */
如果日期采用帶有任何分隔符的“YYYYMMDD”格式,則無需片刻,可以實現更輕松的排序。
const testObj = { "1/10/2015": {}, "2/10/2015": {}, "3/10/2015": {}, "4/10/2015": {}, "29/09/2015": {}, "30/09/2015": {} }; const orderedDates = {}; Object.keys(testObj).sort(function(a, b) { return a.split('/').reverse().join('').localeCompare(b.split('/').reverse().join('')); }).forEach(function(key) { orderedDates[key] = testObj[key]; }) console.log(orderedDates);
使用moment
包,您可以使用:
const yourFormat = 'DD/MM/YYYY'
const sortDateMoments = (dates) => {
const moments = dates.map(date => moment(date, yourFormat))
moments.sort((a, b) => a.isBefore(b) ? 1 : -1)
return moments
}
這可以在不使用 moment 的情況下實現, console.log()
仍然可能會弄亂順序,但是迭代鍵會像魅力一樣工作,是的 ES5 特權。
const sortDatesObject = (unsortedDatesObject) => { const sortedObject = {}; const reverseDate = date => date.split('/').reverse().join('/'); Object.keys(unsortedDatesObject) .map(date => reverseDate(date)) .sort((a, b) => { return new Date(a) - new Date(b) }) .forEach((date) => { sortedObject[reverseDate(date)] = unsortedDatesObject[reverseDate(date)] }); return sortedObject; } testObj = { "1/10/2015": {}, "2/10/2015": {}, "3/10/2015": {}, "4/10/2015": {}, "29/09/2015": {}, "30/09/2015": {} } Object.keys(sortDatesObject(testObj)).forEach(key => console.log(key));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.