对工作日的数组数组进行排序(JavaScript)



拥有下一个数组(例如(:

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

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

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

并不意味着数组中的天数可以是多少天 - 如果大于 1,则应将其他人分别排序到它们在一周内的位置索引。

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

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

  • 使用预先描述的排序对象
    • 使用订购列表可以更轻松地将星期日从第一个切换到最后一个(或进行其他自定义/加权排序(
    • 您不限于对象,可以使用数组(检索索引(或日期(转换日期(,但我认为对象或集合可能更有效
  • 在存在平局的情况下使用递归来计算下一个元素
    • 如果没有下一个元素,则顺序(_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
}

如果您可以重构数据,这可能会有所帮助。

let days = [
{day:'Mon',index:1},
{day:'Sat',index:6},
{day:'Sun',index:0},
{day:'Wed',index:3},
{day:'Tue',index:2},
{day:'Thu',index:4},
{day:'Fri',index:5},
];
days.sort((a,b) => {return a.index > b.index});

我写了一个函数 compareArray,只是为了确定两个数组的顺序,比如 ['Tue', 'Wed'] 和 ['Tue', 'Fri']。 然后在排序函数中使用它

var arr = [
['Tue', 'Fri'],
['Mon'],
['Mon', 'Thu', 'Sun'],
['Wed', 'Thu', 'Sun'],
['Tue', 'Wed']
]
var order = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
var compareArray = (arr1, arr2) => {
for(var i=0;i<arr1.length;i++){
if(!arr2[i]) {return 1}
if(order.indexOf(arr1[i]) < order.indexOf(arr2[i])) {
return -1;
} else if(order.indexOf(arr1[i]) > order.indexOf(arr2[i])){ 
return 1;
}
}
return 0;
}
arr.sort((a,b) => compareArray(a,b))
console.log(arr)

你可以拿一个带有可排序项目的对象,这些项目可以堆叠在一个字符串中。

const
days = { Mon: 'a', Tue: 'b', Wed: 'c', Thu: 'd', Fri: 'e', Sat: 'f', Sun: 'g' },
getV = a => a.map(d => days[d]).join('');
var array = [['Tue', 'Fri'], ['Mon'], ['Mon', 'Thu', 'Sun'], ['Wed', 'Thu', 'Sun'], ['Tue', 'Wed']];
array.sort((a, b) => getV(a).localeCompare(getV(b)));
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果编写两个函数将名称转换为值和将值转换为名称,则它是单行。

function dayvalue (day)
{
switch (day) {
case 'Mon': return 0;
case 'Tue': return 1;
case 'Wed': return 2;
case 'Thu': return 3;
case 'Fri': return 4;
case 'Sat': return 5;
case 'Sun': return 6;
}
}
function dayname (value)
{
switch (value) {
case 0: return 'Mon';
case 1: return 'Tue';
case 2: return 'Wed';
case 3: return 'Thu';
case 4: return 'Fri';
case 5: return 'Sat';
case 6: return 'Sun';
}
}
var days = [
['Tue', 'Fri'],
['Mon'],
['Mon', 'Thu', 'Sun'],
['Wed', 'Thu', 'Sun'],
['Tue', 'Wed']
];
console.log(days.map(names => names.map(dayvalue)).sort().map(values => values.map(dayname)));

您可以通过转换字符串表示中的每个数组并使用String.prototype.localeCompare()进行排序来实现这一点:

const input = [['Tue', 'Fri'],['Mon'],['Mon', 'Thu', 'Sun'],['Wed', 'Thu', 'Sun'],['Tue', 'Wed']];
const days = {Mon:'a', Tue:'b', Wed:'c', Thu:'d', Fri:'e', Sat:'f', Sun:'g'};
const sorted = input.sort((a,b) => {
const [aLoc, bLoc] = [a,b].map(e => e.map(d => days[d]).join(''));
return aLoc.localeCompare(bLoc);
});
console.log(sorted);

最新更新