根据日期键对javascript对象进行排序

时间:2015-09-04 07:11:41

标签: javascript sorting

我有一个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完全相同的对象。如何根据日期键对对象进行排序?

5 个答案:

答案 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));

相关问题