英文:
How can I group by month without losing the order by year?
问题
尝试按年份和月份对数据进行排序以在图表中显示。首先按年份排序,然后按月份排序很顺利,但一旦尝试根据月份将每个项目分组在一起,年份的排序就会丢失。
假设我有一个对象数组如下所示:
const arr = [
{month: 1, year: 2021},
{month: 2, year: 2021},
{month: 3, year: 2021},
{month: 3, year: 2021},
{month: 4, year: 2021},
{month: 9, year: 2020},
{month: 9, year: 2020},
{month: 10, year: 2020},
{month: 11, year: 2020},
{month: 12, year: 2020},
{month: 12, year: 2020},
];
然后,我根据年份和月份排序,得到以下结果:
[
{month: 9, year: 2020},
{month: 9, year: 2020},
{month: 10, year: 2020},
{month: 11, year: 2020},
{month: 12, year: 2020},
{month: 12, year: 2020},
{month: 1, year: 2021},
{month: 2, year: 2021},
{month: 3, year: 2021},
{month: 3, year: 2021},
{month: 4, year: 2021}
]
接下来,如何将对象分组到一个每个月的数组中,同时不丢失这个顺序?尝试最终得到类似以下对象的结果。每次尝试按月份分组时,它都会根据月份进行排序,因此月份1最先出现,这会破坏图表。
const groupedUp = {
9: [{month: 9, year: 2020},{month: 9, year: 2020}],
10: [{month: 10, year: 2020}],
11: [{month: 11, year: 2020}],
12: [{month: 12, year: 2020}, {month: 12, year: 2020}],
1: [{month: 1, year: 2021}],
2: [{month: 2, year: 2021}],
3: [{month: 3, year: 2021},{month: 3, year: 2021}],
4: [{month: 4, year: 2021}]
}
英文:
Trying to sort data for display in a graph by the year and the month category. Sorting first by year and then by month goes great, but then as soon as I try to group each item together based on month, the year sorting goes out the window.
Let's say that I have an array of objects as follows
const arr = [
{month: 1, year: 2021},
{month: 2, year: 2021},
{month: 3, year: 2021},
{month: 3, year: 2021},
{month: 4, year: 2021},
{month: 9, year: 2020},
{month: 9, year: 2020},
{month: 10, year: 2020},
{month: 11, year: 2020},
{month: 12, year: 2020},
{month: 12, year: 2020},
];
I then sort based on year and then month so I get this resulting arr:
[
{month: 9, year: 2020},
{month: 9, year: 2020},
{month: 10, year: 2020},
{month: 11, year: 2020},
{month: 12, year: 2020},
{month: 12, year: 2020},
{month: 1, year: 2021},
{month: 2, year: 2021},
{month: 3, year: 2021},
{month: 3, year: 2021},
{month: 4, year: 2021}
]
How can I then group the objects into an array of each month while not losing this order? Trying to end up with something like the following Object. Every time I try to group by month it ends up sorting it based on month and so Month: 1 ends up coming first which screws up the graph.
const groupedUp = {
9: [{month: 9, year: 2020},{month: 9, year: 2020}],
10: [{month: 10, year: 2020}],
11: [{month: 11, year: 2020}],
12: [{month: 12, year: 2020}, {month: 12, year: 2020}],
1: [{month: 1, year: 2021}],
2: [{month: 2, year: 2021}],
3: [{month: 3, year: 2021},{month: 3, year: 2021}],
4: [{month: 4, year: 2021}]
}
答案1
得分: 2
在对象中,数值属性总是按升序排序。您可以使用 Map
代替,以在分组时保持插入顺序。
let sorted = [
{month: 9, year: 2020},
{month: 9, year: 2020},
{month: 10, year: 2020},
{month: 11, year: 2020},
{month: 12, year: 2020},
{month: 12, year: 2020},
{month: 1, year: 2021},
{month: 2, year: 2021},
{month: 3, year: 2021},
{month: 3, year: 2021},
{month: 4, year: 2021}
];
let res = sorted.reduce((map, curr) => {
if (!map.has(curr.month)) map.set(curr.month, []);
map.get(curr.month).push(curr);
return map;
}, new Map);
res.forEach((v, k) => console.log(k, '=', JSON.stringify(v)));
英文:
In an object, numeric properties are always sorted in ascending order. You can use a Map
instead to maintain insertion order when grouping.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
let sorted = [
{month: 9, year: 2020},
{month: 9, year: 2020},
{month: 10, year: 2020},
{month: 11, year: 2020},
{month: 12, year: 2020},
{month: 12, year: 2020},
{month: 1, year: 2021},
{month: 2, year: 2021},
{month: 3, year: 2021},
{month: 3, year: 2021},
{month: 4, year: 2021}
];
let res = sorted.reduce((map, curr) => {
if (!map.has(curr.month)) map.set(curr.month, []);
map.get(curr.month).push(curr);
return map;
}, new Map);
res.forEach((v, k) => console.log(k, '=', JSON.stringify(v)));
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论