按键为字符串日期对对象键值对进行排序

Sort object key-value pairs by keys being string dates

我是编码和尝试学习的新手,如果这个问题可能被重复发布,我深表歉意。我搜索了论坛,找到了一些提示,但没有找到解决方案。

我有一个看起来像这样的对象:

Dates: { '10/25/2019': 'sth',
         '6/21/2017': 'sthelse',
         '4/15/2016': 'anotherone',
         '12/29/2015': 'wtf',
         '8/18/2018': 'lol' }

我希望它按日期排序,从最晚到最旧。然而,日期键是一个字符串,最终结果应该是相同的。 我首先尝试用“/”拆分密钥,然后创建一个分数,其中 priority1 是年份,priority2 是月份,prio3 是日期,但它最终变成了意大利面条,我无法弄清楚。

所以我在论坛中找到了以下内容: How to sort an object array by date property? 并试图弄清楚,但不幸的是失败了,因为我不是在对对象数组进行排序,而是在对对象本身进行排序。

这是我的解决方案

function sortthedates(unsorted){
  sorteddates = {}
  datesunsorted = unsorted;
  key = Object.keys(datesunsorted);
  value = Object.values(datesunsorted);
  var sorted = key.sort((a, b) => {
    return new Date(b) - new Date(a);
  });
  for (var y = 0; y < sorted.length; y++){
    sorteddates[sorted[y]] = datesunsorted[sorted[y]];
  }
  return sorteddates;
}

它产生了正确的结果,但看起来很像意大利面条式代码而且效率低下。

有没有更简单、更短的方法来完成任务?

在此先感谢您的帮助:) 最好的问候

我发现以下内容更具可读性。从对象中获取键(a.k.a 日期),将对象中的每个条目映射到新的 'key'、'value' 对对象,然后按日期 属性 排序。

var dates = { '10/25/2019': 'sth',
         '6/21/2017': 'sthelse',
         '4/15/2016': 'anotherone',
         '12/29/2015': 'wtf',
         '8/18/2018': 'lol' };
var sorted = Object.keys(dates)
                   .map(k => ({ key: new Date(k), value: dates[k] }))
                   .sort((a,b) => a.key-b.key)
                   .reduce((cv,pv) => {
                       cv[pv.key] = pv.value;
                       return cv;
                   }, {});
console.log(sorted);

虽然我不太明白为什么对象中的属性顺序会有任何相关性(并且您不应该依赖它),但这应该可行

function sort(o) {
  let keys = Object.keys(o)
    .sort((a,b) => new Date(a).getTime() - new Date(b).getTime());

  let r = {};
  for (let k of keys) r[k] = o[k];
  return r;
}

如果你喜欢reduce,你可以在一条语句中完成

function sort(o) {
  return Object.keys(o)
    .sort((a,b) => new Date(a).getTime() - new Date(b).getTime()) 
    .reduce((a, k) => { 
        a[k] = o[k];
        return a;
      }, {});
}

但是恕我直言,该循环更具可读性,并且没有真正看到在此处使用 reduce 的优势...