簡體   English   中英

根據日期鍵對javascript對象進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM