【问题标题】:Sorting a Map with dates as the key (javascript)以日期为键对地图进行排序(javascript)
【发布时间】:2020-11-09 10:36:05
【问题描述】:

我想在 javascript 中对地图进行排序。 地图如下所示:

0: { key: '2020-09-29', value: { foo: 1, bar: 2} },
1: { key: '2020-09-01', value: { foo: 3, bar: 4} },
2: { key: '2020-09-08', value: { foo: 5, bar: 6} }

等等..

我找不到解决方案,有人可以给我提示吗?

我已经尝试过这样的事情:

days_map = new Map([...days_map].sort(function(key, value) { return new Date(key); }));

但它没有对地图进行排序。

谢谢

【问题讨论】:

    标签: javascript date sorting


    【解决方案1】:

    您可以使用带有String#localeCompare 的键对数组进行排序。

    let map = new Map([['2020-09-29', { foo: 1, bar: 2 }], ['2020-09-01', { foo: 3, bar: 4 }], ['2020-09-08', { foo: 5, bar: 6 }]]),
        sorted = new Map(Array.from(map).sort(([a], [b]) => a.localeCompare(b)));
    
    console.log([...map]);
    console.log([...sorted]);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案2】:

      var input = [{
          key: '2020-09-29',
          value: {
            foo: 1,
            bar: 2
          }
        },
        {
          key: '2020-09-01',
          value: {
            foo: 3,
            bar: 4
          }
        },
        {
          key: '2020-09-08',
          value: {
            foo: 5,
            bar: 6
          }
        }
      ]
      
      input.sort((a, b) => {
        const first = a.key
        const second = b.key
        
        return first > second ? 1 : (first < second ? -1 : 0)
      });
      console.log(input);

      【讨论】:

      • 这不处理日期之间的相等性,在某些极端情况下可能会导致错误的结果。
      • 如果他的输入键值是日期格式而不是空的,我想没有错。 @VLAZ
      • 没有处理a === b。比较器必须返回 三个 值 - 更大、更小和相等。您忽略了最后一种可能性并将其归为“较小”。因此,您的比较器不是对称的 - 它为 compare(a, b)compare(b, a) 产生不同的结果。这可以欺骗排序算法将某些项目排序为不相等,而实际上它们不相等。此外,这将取决于环境和数据集,因此在正常情况下非常很难找到和调试。排序和日期排序都有据可查,没有理由偏离。
      • 另外相关的是无需转换为Date 对象。日期是 ISO 8601 字符串,这意味着它们的字典排序等于时间排序。
      • 我明白了,谢谢你的建议。我刚刚更新了答案
      猜你喜欢
      • 2015-11-07
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      相关资源
      最近更新 更多