2015-09-04 128 views
2

我有一个JavaScript对象,看起来像如下基于日期键排序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

这里的答案http://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order – mguimard

+0

@mguimard但使用const'的'将指示[ES6](http://stackoverflow.com/questions/30076219/does-es6-introduce-a-well-defined-order-of-enumeration-for-object-properties),而不是ES5 – CodingIntrigue

回答

5

此行返回字符串

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>