Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于日期键对javascript对象排序_Javascript_Sorting - Fatal编程技术网

基于日期键对javascript对象排序

基于日期键对javascript对象排序,javascript,sorting,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(functi

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

此行返回一个字符串:

但该方法需要一个整数值,因此您需要比较实际日期:

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(函数(日期){console.log(日期);})将按预期工作

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(函数(a,b){
返回力矩(b,'DD/MM/YYYY').toDate()-力矩(a,'DD/MM/YYYY').toDate();
}).forEach(功能(键){
orderedDates[key]=testObj[key];
})
Object.key(orderedDates).forEach(函数(日期){
document.body.innerHTML+=日期+“
” });
使用
力矩
软件包,您可以使用:

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
}

如果日期的格式为“YYYYMMDD”,且带有任何分隔符,则无需使用矩,即可实现更轻松的排序

const testObj={
"1/10/2015": {},
"2/10/2015": {},
"3/10/2015": {},
"4/10/2015": {},
"29/09/2015": {},
"30/09/2015": {}
};
常量orderedDates={};
Object.keys(testObj).sort(函数(a,b){
返回a.split('/').reverse().join('').localeCompare(b.split('/').reverse().join('');
}).forEach(功能(键){
orderedDates[key]=testObj[key];
})

console.log(orderedDates)
这里是@mguimard的答案,但是使用
const
将表明,在forEach循环之后,not es5forme ordered对象仍然没有排序。然而,在循环中,元素是有序的。我猜这是因为您将testObj分配给一个字典,它不能保证顺序
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": {} */
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
}