javascript - 对工作日数组进行排序(JavaScript)
问题描述
有下一个数组(例如):
[
['Tue', 'Fri'],
['Mon'],
['Mon', 'Thu', 'Sun'],
['Wed', 'Thu', 'Sun'],
['Tue', 'Wed']
]
我需要对其进行排序以获得下一个:
[
['Mon'],
['Mon', 'Thu', 'Sun'],
['Tue', 'Wed'],
['Tue', 'Fri'],
['Wed', 'Thu', 'Sun']
]
并不意味着数组中的天数可以是多少 - 如果它超过 1,其他应该分别排序到他们在周中的位置索引。
这样的排序功能如何实现?谢谢。
解决方案
这不会考虑所有情况,但会执行以下操作:
- 使用预先描述的排序对象
- 使用排序列表可以更轻松地从第一个到最后一个星期天切换(或有一些其他自定义/加权排序)
- 您不仅限于对象,还可以使用数组(检索索引)或日期(转换日期),但我认为对象或集合可能更有效
- 在存在平局的情况下使用递归来评估下一个元素
- 如果没有下一个元素,则 order (
_a
或_b
) 默认为0
,因为缺少元素是更高的优先级 - 您可以在那里进行检查以完全避免递归调用
- 如果没有下一个元素,则 order (
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
}
推荐阅读
- java - POS 客户显示(基于 Web 的应用程序)
- javascript - 在 HTML 中,我如何构建一个文件选择器,它可以在不使用动作监听器的情况下更改显示的图像?
- spring - Spring 5.0.5 @Value 无法解析为正确的类型
- python - 使用 Boosting 树在 sklearn 中生成特征
- symfony4 - Symfony 4 使用 URL 检查数据库是否存在页面,否则 404
- postgresql - 将一列字符串与其他表中的列匹配
- objective-c - 从另一个项目复制类并删除 XCode 中的连接
- javascript - window[name] 相当于动态访问 const 和 let 声明
- android - 仅在我的生产环境中来自 Google API 的“401:无效凭据”
- javascript - Cloud Functions for Firebase onWrite 触发器:snapshot.val 不是函数