【问题标题】:Sort object key-value pairs by keys being string dates按作为字符串日期的键对对象键值对进行排序
【发布时间】:2021-09-06 10:52:40
【问题描述】:

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

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

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

我希望它按日期排序,从最新日期到最早日期。然而,日期键是一个字符串,最终结果应该是相同的。 我首先尝试用'/'分割键,然后创建一个分数,priority1 是年,prior2 是月,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;
}

这会产生正确的结果,但似乎非常像意大利面条代码并且效率低下。

有没有更好更简单的方法来完成这项任务?

提前感谢您的帮助:) 最好的问候

【问题讨论】:

    标签: javascript sorting object key-value


    【解决方案1】:

    我发现以下内容更具可读性。从对象中获取键(也就是日期),将对象中的每个条目映射到新的“键”、“值”对对象,然后按日期属性排序。

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

    【讨论】:

    • 现在它确实返回了一个对象,但它修改了键...
    • 这是一种更有条理的方式,是的,尽管我对 map 和 reduce 还不是很熟悉。我会尝试一下,看看什么最适合我。感谢您的回答和帮助!
    【解决方案2】:

    虽然我真的不明白为什么对象中的属性顺序会有任何相关性(而且你不应该依赖它)这应该可以工作

    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 并没有真正看到优势...

    【讨论】:

    • 这就是我想要的!为什么可能只是因为我的编码技能仍然是 0 :D 感谢您的回答和帮助!最好的问候
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2015-06-21
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多