【问题标题】:Javascript sort an Array of Week DaysJavascript对工作日数组进行排序
【发布时间】:2021-08-13 20:17:46
【问题描述】:

也许有人可以解释一下如何从星期一开始对一组工作日进行排序...

export const WeekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];

WeekDays.sort(
  (a, b) =>
  WeekDays.indexOf(a) - WeekDays.indexOf(b)
);

但结果是:周三、周一、周二、周五、周三... 希望有人能提供帮助。

【问题讨论】:

标签: javascript arrays


【解决方案1】:

问题在于sort() 执行就地排序,而不是返回一个新的排序数组,因此您的参考数组正在排序。尝试对单独的数组进行排序:

const WeekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];

const daysToBeSorted = WeekDays.slice();

daysToBeSorted.sort(
  (a, b) =>
  WeekDays.indexOf(a) - WeekDays.indexOf(b)
);

也就是说,这种方法是在排序的每次迭代中查找当天的索引 (indexOf()),这通常效率不高。您可以使用地图或对象来快速访问当天的索引。

【讨论】:

    【解决方案2】:

    作为@Berthurs 回答的补充,这里是您如何提高关键功能的时间复杂度的方法。它目前的 O(n) 即随着输入的大小线性缩放。

    要将其减少到恒定时间 O(1),请使用一个对象将日期名称映射到原始数组中的索引。这样您就不必在每次调用 key 函数时再次查找它们。它们已经计算过了。如果这不是 100% 清楚,orderMap 最终看起来像这样。

    { "Sunday": 0, "Monday": 1, "Tuesday": 2, "Wednesday": 3, "Thursday": 4, "Friday": 5, "Saturday": 6 }
    

    代码

    const weekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    const orderMap = weekDays.reduce((accum, val, i) => { accum[val] = i; return accum; }, {});
    
    const arrCopy = [...weekDays, ...weekDays, ...weekDays];
    
    arrCopy.sort((a, b) => orderMap[a] - orderMap[b]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多