JavaScript中星期数组排序异常 如何实现按周一到周日正确排序
错误原因
Array.sort()为原地排序方法,排序过程中会实时修改原数组元素顺序,你在排序回调中调用WeekDays.indexOf()获取的是动态变化的数组索引,不是初始定义的固定顺序,因此排序逻辑完全错乱。- 初始定义的数组默认以周日为第一个元素,未做权重调整的话无法实现周一起始的排序要求。
解决方案
方案1:固定权重映射(性能更优)
预先定义好星期对应的排序权重,直接用权重比较,不需要遍历数组查索引:
// 权重值越小排序越靠前,按周一起始的规则配置 const weekWeightMap = { Monday: 1, Tuesday: 2, Wednesday: 3, Thursday: 4, Friday: 5, Saturday: 6, Sunday: 7 }; export const originalWeekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; // 拷贝原数组后排序,避免修改原数组 export const sortedWeekDays = [...originalWeekDays].sort((a, b) => weekWeightMap[a] - weekWeightMap[b]);
方案2:基于初始固定数组计算权重
如果不想单独维护权重映射,可以保留初始数组作为固定索引参照,不要直接在原数组上执行排序:
// 作为固定索引参照,永远不修改该数组 const fixedWeekOrder = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; export const WeekDays = [...fixedWeekOrder]; WeekDays.sort((a, b) => { // 周日的初始索引为0,调整权重为7放到最后,其余按原索引排序即可实现周一起始 const getSortWeight = (day) => { const originIndex = fixedWeekOrder.indexOf(day); return originIndex === 0 ? 7 : originIndex; }; return getSortWeight(a) - getSortWeight(b); });
两种方案最终输出的排序结果均为:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],符合周一开始的排序要求。
内容的提问来源于stack exchange,提问作者tripleD
相关产品推荐
相关产品推荐

