按年份对日期排序并按周分组

时间:2019-01-04 14:45:14

标签: javascript momentjs

我有一系列去年和今年的日期。我想按星期数对数据进行分组,然后按年份对它们进行排序。 2019年的第3周错了,我也不知道为什么。

const test = [
    '2019-02-02T00:00:00.000Z',
    '2019-01-25T00:00:00.000Z',
    '2019-01-07T23:00:00.000Z',
    '2019-01-16T23:00:00.000Z',
    '2019-01-07T23:00:00.000Z',
    '2019-01-06T23:00:00.000Z',
    '2019-01-09T23:00:00.000Z',
    '2019-01-08T23:00:00.000Z',
    '2019-01-08T23:00:00.000Z',
    '2018-12-19T23:00:00.000Z'
];

const groupedResults = _.groupBy(test, (result) => {
  return moment.utc(result).startOf('isoWeek').format('YYYY-W');
});
console.log(groupedResults);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

编辑,第3周应该在第2周之后(如2、3、4、5),而不是

之前

1 个答案:

答案 0 :(得分:2)

  

第3周应该在第2周之后(如2、3、4、5),而不是之前

有两个问题:

  1. 您没有做任何排序结果的操作,并且输入未按排序顺序,因此自然不会对结果进行排序。

  2. 尽管对象属性现在确实具有顺序(从ES2015开始),但是不需要某些操作(Object.keysfor-in)遵守该顺序。 (此外,正如Trincot所指出的,从概念上说对象即使在机械上也没有顺序对其属性进行排序。)通常,如果要排序,请使用数组而不是对象。或者,如果您想要定义的顺序和键/值对,请使用Map,它以创建顺序维护其条目(对于Map的所有操作)。

如果要坚持使用对象并依靠ES2015 +属性顺序,则最简单的解决方案是在创建输出之前对输入进行排序,以便按所需顺序创建星期的属性(因为这些属性名称不是整数索引,因此它们将按照创建顺序列出)。

如果您切换到数组,那么自然可以轻松随意地对结果数组进行排序。