首页 > 解决方案 > 对工作日数组进行排序(JavaScript)

问题描述

有下一个数组(例如):

[
 ['Tue', 'Fri'],
 ['Mon'],
 ['Mon', 'Thu', 'Sun'],
 ['Wed', 'Thu', 'Sun'],
 ['Tue', 'Wed']
]

我需要对其进行排序以获得下一个:

[
 ['Mon'],
 ['Mon', 'Thu', 'Sun'],
 ['Tue', 'Wed'],
 ['Tue', 'Fri'],
 ['Wed', 'Thu', 'Sun']
]

并不意味着数组中的天数可以是多少 - 如果它超过 1,其他应该分别排序到他们在周中的位置索引。

这样的排序功能如何实现?谢谢。

标签: javascriptarrayssortingdatedays

解决方案


这不会考虑所有情况,但会执行以下操作:

  • 使用预先描述的排序对象
    • 使用排序列表可以更轻松地从第一个到最后一个星期天切换(或有一些其他自定义/加权排序)
    • 您不仅限于对象,还可以使用数组(检索索引)或日期(转换日期),但我认为对象或集合可能更有效
  • 在存在平局的情况下使用递归来评估下一个元素
    • 如果没有下一个元素,则 order (_a_b) 默认为0,因为缺少元素是更高的优先级
    • 您可以在那里进行检查以完全避免递归调用

let order = {
 'Mon':1,
 'Tue':2,
 'Wed':3,
 'Thu':4,
 'Fri':5,
 'Sat':6,
 'Sun':7
}

let arr = [
 ['Tue', 'Fri'],
 ['Mon'],
 ['Mon', 'Thu', 'Sun'],
 ['Wed', 'Thu', 'Sun'],
 ['Tue', 'Wed']
]


let sorted = arr.sort(sortElements)
console.log('sorted:',sorted)


function sortElements(a,b,ndx=0){
  let _a = order[ a[ndx] ] || 0
  let _b = order[ b[ndx] ] || 0
    
  if ( _a === _b && (a.length > ndx || b.length > ndx))
    return sortElements(a,b,ndx+1)
  else
    return _a - _b
}


推荐阅读