我有一个包含唯一日期名称字符串的数组。这些日期名称将按随机顺序出现,例如:
["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm"]
我想使用JavaScript对该数组进行排序,以使其按升序排列。
["Wed 3pm", "Sat 10am", "Sat 4pm", "Sun 10am", "Sun 4pm"]
有人可以建议如何最好地做到这一点吗?
谢谢
我有一个包含唯一日期名称字符串的数组。这些日期名称将按随机顺序出现,例如:
["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm"]
["Wed 3pm", "Sat 10am", "Sat 4pm", "Sun 10am", "Sun 4pm"]
有人可以建议如何最好地做到这一点吗?
谢谢
const
getTime = string => {
var [day, hour, meridian] = string.match(/^(\D{3}) (\d+)(am|pm)/).slice(1),
days = { Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6, Sun: 7 };
return days[day] * 24 + +hour + (meridian === 'pm' && 12) + (hour === '12' && -12);
};
var array = ["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm", "Sat 12pm", "Sat 12am"];
array.sort((a, b) => getTime(a) - getTime(b));
console.log(array);
(hour === '12' && -12)
的原因吗? - Maheer Ali你可以创建一个以星期几名称为键,值递增从1到7的对象。
创建一个帮助函数,它以字符串的第二部分(即3pm,10am..
)作为输入,如果是pm
则将结果加上12
。
24
,这样第一次sort
就应该按照星期进行。sort()
函数,对于每个值,将时间索引(始终小于1)添加到星期索引(1,2,3...
),并从两个值中都减去它。const arr = ["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm"];
function getTime(str){
let time = str.slice(0,-2);
let isAm = str.includes('am');
return (isAm ? +time : +time + 12)/24
}
function sortTime(arr){
let days = {
Mon:1,
Tue:2,
Wed:3,
Thur:4,
Fri:5,
Sat:6,
Sun:7
}
return arr.slice().sort((a,b) => {
let [day1,time1] = a.split(' ');
let [day2,time2] = b.split(' ');
return (days[day1] + getTime(time1)) - (days[day2] + getTime(time2))
})
}
console.log(sortTime(arr))
map
和sort
的组合。这里,我将时间转换为24小时制,以便更轻松地比较数字。"Original Answer"翻译成"最初的回答"。
var array = ["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm"],
mapping = { Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6, Sun: 7 },
result = array
.map((time, i) => {
const hour = parseInt(time.split(" ")[1], 10);
const hour24 = time.indexOf("am") > -1 ? hour : hour + 12;
return {
index: i,
day: mapping[time.split(" ")[0]],
hour24
}
})
.sort((a, b) => a.day - b.day || a.hour24 - b.hour24)
.map(({
index
}) => array[index]);
console.log(result);