首页 > 解决方案 > 用Javascript计算假期

问题描述

作为学习练习,我在这里提出了问题:用Javascript计算假期,并通过建议的方法,自己开发了一个使用 ES6 数组方法的解决方案。

上面链接的上一个堆栈帖子建议了一种对象方法,但答案不包含任何代码。我决定使用数组方法,并提供一个完整的编码示例。具有 8K 视图的旧帖子没有提供数组方法,并且 OP 已经有了答案,所以我创建了一个新问题并进行了自我回答。

我还在学习中,所以我请专业人士对此进行改进!我进行了一些性能测试,if/then 方法更快,但这段代码有效。同样如您所见,我无法链接 .findIndex(),但这只会导致另一个变量和另一行代码。需要注意的是,旧版浏览器不支持某些 ES6 数组方法。

无论如何,我希望这会有所帮助。

标签: javascriptarrays

解决方案


function check_holiday4(ds) {
  const [m, d, y] = ds.split('/');
  const h = [ // keys are formatted as month,week,day
    ["0,1", "New Year's Day"],
    ["0,3,1", "Martin Luther King, Jr. Day"],
    ["0,20", (function() {
      if (((y - 1937) % 4) == 0) return 'Inauguration Day'
    })()],
    ["1,14", "Valentine's Day"],
    ["1,3,1", "President's Day"],
    ["2,2,0", "Daylight Savings Time Begins"],
    ["3,3,3", "Administrative Professionals Day"],
    ["4,2,0", "Mother's Day"],
    ["4,5,1", "Memorial Day"],
    ["5,14", "Flag Day"],
    ["5,3,0", "Father's Day"],
    ["5,3,6", "Armed Forces Day"],
    ["6,4", "Independence Day"],
    ["6,4,0", "Parents Day"],
    ["8,1,1", "Labor Day"],
    ["9,2,1", "Columbus Day"],
    ["9,31", "Halloween"],
    ["10,11", "Veterans Day"],
    ["10,1,0", "Daylight Savings Time Ends"],
    ["10,1,2", "Election Day"],
    ["10,4,4", "Thanksgiving Day"],
    ["11,25", "Christmas Day"]
  ];
  const f = (a, n, d) => (d + 6 - new Date(...a, 7).getDay()) % 7 + n * 7 - 6;
  const dim = (y, m) => new Date(y, m + 1, 0).getDate();
  const hc = (y, m) => h.filter(v => v[0].startsWith(m)).map((val, i) => {
    const [vm, vn, vdw] = val[0].split(',');
    let cd = f([y, vm], vn, +vdw);
    cd = (cd > dim(y, vm)) ? cd - 7 : (val[0].split(',').length === 2) ? vn : cd;
    val[0] = (+vm + 1) + "/" + cd + "/" + y;
    return [val[0], val[1]];
  });
  const ha = hc(y, m - 1);
  return ha[ha.findIndex(sa => sa[0] === ds)][1];
}

console.log(check_holiday4(new Date("10/31/2019").toLocaleDateString()));
// "Halloween"

console.log(check_holiday4(new Date("5/31/2021").toLocaleDateString()));
// "Memorial Day"


推荐阅读