如何按月份名称的字母顺序对分组后的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
相关产品推荐
相关产品推荐

