我有一个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
完全相同的对象。如何根据日期键对对象进行排序?
答案 0 :(得分:6)
此行返回字符串:
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>
答案 1 :(得分:1)
Without moment library you can also do. It will Work for angular and vue js also
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": {} */
答案 2 :(得分:0)
使用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
}
答案 3 :(得分:0)
如果日期格式为“ 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);
答案 4 :(得分:0)
这可以在不使用 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));