【问题标题】:Sort array of days in ascending order按升序对天数数组进行排序
【发布时间】:2019-05-27 06:17:17
【问题描述】:

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

["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm"]

我想使用 javascript 对该数组进行排序,使其按升序排列。

["Wed 3pm", "Sat 10am", "Sat 4pm", "Sun 10am", "Sun 4pm"]

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

谢谢

【问题讨论】:

  • 这很容易。您只需为每个令牌设置一天的优先级值。然后您可以使用比较器对其进行排序。

标签: javascript node.js algorithm sorting


【解决方案1】:
  • 您可以创建一个对象,其中日期名称作为键,值从 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))

【讨论】:

    【解决方案2】:

    您可以取一个对象作为当天的值并按时间排序。

    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);

    【讨论】:

    • 但是“周六上午 10 点”应该出现在“周六下午 4 点”之前,对吧? @Nina Scholz
    • @DeepshikhaChaudhary,你是对的。请参阅编辑。
    • @NinaScholz 是的,现在很好。(我没有拒绝)。请问(hour === '12' && -12)的原因。
    【解决方案3】:

    您可以使用mapsort 的组合。在这里,我将时间转换为 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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多