按升序排序天数数组

Zhe*_* Le 6 javascript sorting algorithm node.js

我有一个包含日期名称的唯一字符串的数组。日期名称将以随机顺序排列。-例如:

["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm"]
Run Code Online (Sandbox Code Playgroud)

我想使用javascript对该数组进行排序,以便它以升序排列。

["Wed 3pm", "Sat 10am", "Sat 4pm", "Sun 10am", "Sun 4pm"]
Run Code Online (Sandbox Code Playgroud)

有人可以建议最好的方法吗?

谢谢

Mah*_*Ali 5

  • 您可以创建一个以天名称为键的对象,并将值从1增大到7。

  • 创建一个辅助函数,将字符串的第二部分3pm,10am..作为输入,并添加12到结果中pm

  • 也将结果除以,24因此首先sort应该在几天内发生。
  • 使用该sort()函数,然后为每个值将时间索引(将始终小于1)添加到天index(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))
Run Code Online (Sandbox Code Playgroud)


voi*_*oid 2

map您可以使用和的组合sort。这里我将时间转换为 24 小时格式,以便于数字比较。

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);
Run Code Online (Sandbox Code Playgroud)