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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 23:06:09