前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >更新一道js面试题目

更新一道js面试题目

作者头像
挥刀北上
发布2020-05-22 11:13:58
4970
发布2020-05-22 11:13:58
举报
文章被收录于专栏:Node.js开发

题图 From Bing

今天跟大家分享一道面试题目,这个题目是这样的:给定5个相同格式的日期,怎么判断是否是连续的5天呢?

数据如下:

代码语言:javascript
复制
let days = [
  '2016-02-28',
  '2016-02-29', // 闰月
  '2016-03-01', // 跨月
  '2016-03-02',
  '2016-03-03',
]

看到这个题目,我瞬间想到了另外的一个题目:一个数组,数组中有5个数字,如何判断这5个数字是否是连续的:

代码语言:javascript
复制
let arr = [1,2,3,4,5]

感觉这两道题目的解法是一样的,后面这道数字的相对比较简单,不用处理时间问题,咱们先来解决后面这道题。

那么思路是什么样的呢?我们可以假设arr数组中5个数字是连续的,然后在此基础之上,我们做一些操作,做什么操作呢?

假如5个数字是连续的,那么第一个数字加4,第二个数字加3,第三个数字加2,第四个数字加1,第五个数字加0,最终得到:

代码语言:javascript
复制
let newarr = [5,5,5,5,5];

然后判断每个数字是否都相等,如果相等那么说明arr是连续的,反之则是不连续的。

思路有了,代码如下:

代码语言:javascript
复制
let arr = [1,2,3,4,5];

let newarr = arr.sort().map((e,i)=>{
    return e+4-i
})
let stand = newarr[0];

let isTrue = newarr.every(e=>{
    return e===stand
})

console.log(isTrue)

接下来我们看日期是否连续该如何判断:

代码语言:javascript
复制
let days = [
  '2016-02-28',
  '2016-02-29', // 闰月
  '2016-03-01', // 跨月
  '2016-03-02',
  '2016-03-03',
]

观察上面的日期数组,我们假定日期是连续的,然后对每一个日期进行处理,但是该如何处理呢?

上面数字题目比较直观,假设数字连续,设置成相同数字,日期则需要利用js的日期处理API了,我们可以利用Date对象的setDate方法将其设置成相同的日期。

简单说就是将2016-02-28、2016-02-29等日期设置成2016-03-03,我们可以这样做,代码如下:

代码语言:javascript
复制
let dt = new Date("2016-02-28");
dt.setDate(dt.getDate()+4-1)
console.log(dt)

打印结果:

处理日期的方法有了,将给定数组中所有日期都处理一下,最终代码如下:

代码语言:javascript
复制
let days = [
    '2016-02-28',
    '2016-02-29', // 闰月
    '2016-03-01', // 跨月
    '2016-03-02',
    '2016-03-03',
]

let newdays = days.map((e,i)=>{
    let dt = new Date(e);
    dt.setDate(dt.getDate() + 4 - i);
    //转换成时间戳
    return +dt
})
let stand = newdays[0]
let isTrue = newdays.every(e=>{
    console.log(e,stand)
    return stand ===e
})
console.log(isTrue)

再深入一下,如果给的时间是这样的呢?

代码语言:javascript
复制
let days = [
  '2016-02-28 12:00:00',
  '2016-02-29 12:00:01', // 闰月
  '2016-03-01 12:00:02', // 跨月
  '2016-03-02 12:00:03',
  '2016-03-03 12:00:04',
  '2016-03-04 12:00:04',
]

我们只需要对时间的时、分、秒、毫秒,处理一下即可,代码如下:

代码语言:javascript
复制
let days = [
    '2016-02-28 12:00:00',
    '2016-02-29 12:00:01', // 闰月
    '2016-03-01 12:00:02', // 跨月
    '2016-03-02 12:00:03',
    '2016-03-03 12:00:04',
    '2016-03-04 12:00:04',
]

let newdays = days.map((e,i)=>{
        let dt = new Date(e);
        dt.setDate(dt.getDate() + 4 - i);
        dt.setHours(0);
        dt.setMinutes(0);
        dt.setSeconds(0);
        dt.setMilliseconds(0);
        return +dt
})
let stand = newdays[0]
let isTrue = newdays.every(e=>{
    return stand ===e
})
console.log(isTrue)

以上便是今天的分享,希望对你有些许帮助和启发。

js 判断一组日期是否是连续的 https://www.52cik.com/2016/07/10/consecutive-dates.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nodejs全栈开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档