You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按月份名称的字母顺序对分组后的Conso数据进行排序?

解决按月份名称字母顺序排序分组数据的问题

问题出在你用月份名称作为对象键分组后,Object.keys(groups)返回的键顺序是数据中月份首次出现的顺序,而不是字母顺序。即使ES6+对象会保留插入顺序,这也和你想要的字母排序逻辑不一致。

快速修复:对分组后的数组进行排序

在生成groupArrays之后,直接添加排序逻辑,按月份名称的字母顺序排列:

//Mapping data to array
this.groupArrays = Object.keys(groups).map((mois) => {
  return {
    mois,
    sum: groups[mois].reduce((a, b) => a + parseInt(b.food_prix), 0),
    donnes: groups[mois].sort(
      (objA, objB) => new Date(objA.date_achat).getTime() - new Date(objB.date_achat).getTime()
    ),
  };
})
// 新增:按月份名称字母顺序排序
.sort((a, b) => a.mois.localeCompare(b.mois));

如果你的月份名称是荷兰语(从Januari、Maart这些拼写来看),可以指定语言参数让排序更准确:

.sort((a, b) => a.mois.localeCompare(b.mois, 'nl-NL'));

额外优化:改进getMonthName函数

你的原函数用forEach遍历整个数组找匹配项,效率偏低,而且如果传入无效的月份数字,会返回undefined导致报错。可以改用find方法,并添加默认值:

getMonthName(monthNumber: number): string {
  const monat = [
    { id: 1, title: 'Januari' },
    { id: 2, title: 'Februari' },
    { id: 3, title: 'Maart' },
    { id: 4, title: 'April' },
    { id: 5, title: 'Mei' },
    { id: 6, title: 'Juni' },
    { id: 7, title: 'Juli' },
    { id: 8, title: 'Aout' },
    { id: 9, title: 'Sept' },
    { id: 10, title: 'Oct' },
    { id: 11, title: 'Nov' },
    { id: 12, title: 'Dec' },
  ];
  const matchedMonth = monat.find(yue => yue.id === monthNumber);
  // 找不到匹配项时返回默认值,避免undefined
  return matchedMonth ? matchedMonth.title : 'Onbekende maand';
}

为什么之前的方法不生效?

当你用const MM = this.getMonthName(month)作为对象键分组时,groups对象的键是按照数据中月份首次出现的顺序添加的。比如如果你的数据里第一个记录是1月(Januari),第二个是3月(Maart),那么Object.keys(groups)会返回['Januari', 'Maart'],而不是字母序的['April', 'Januari', ...]。只有手动对最终的数组进行排序,才能得到你想要的字母顺序结果。

内容的提问来源于stack exchange,提问作者user609511

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:02:35