我有一系列去年和今年的日期。我想按星期数对数据进行分组,然后按年份对它们进行排序。 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),而不是
之前答案 0 :(得分:2)
第3周应该在第2周之后(如2、3、4、5),而不是之前
有两个问题:
您没有做任何排序结果的操作,并且输入未按排序顺序,因此自然不会对结果进行排序。
尽管对象属性现在确实具有顺序(从ES2015开始),但是不需要某些操作(Object.keys
,for-in
)遵守该顺序。 (此外,正如Trincot所指出的,从概念上说对象即使在机械上也没有顺序对其属性进行排序。)通常,如果要排序,请使用数组而不是对象。或者,如果您想要定义的顺序和键/值对,请使用Map
,它以创建顺序维护其条目(对于Map
的所有操作)。
如果要坚持使用对象并依靠ES2015 +属性顺序,则最简单的解决方案是在创建输出之前对输入进行排序,以便按所需顺序创建星期的属性(因为这些属性名称不是整数索引,因此它们将按照创建顺序列出)。
如果您切换到数组,那么自然可以轻松随意地对结果数组进行排序。