Javascript 查找特定日期所属的确切日期组或下一个最近的日期组

Javascript 查找特定日期所属的确切日期组或下一个最近的日期组,javascript,Javascript,因此,我的json数据如下所示: [ {"begin": "2018-01-01", "end": "2018-01-07", "id":"a"}, {"begin":"2018-01-08", "end":"2018-01-15", "id":"b"}, {"begin":"2018-03-01", "end":"2018-03-07", "id":"y"}] 每周7天的间隔是这样的。给定一个特定的日期,我想根据该日期提取它的id。例如2018-01-01至2018-01-07将是id a

因此,我的json数据如下所示:

 [ {"begin": "2018-01-01", "end": "2018-01-07", "id":"a"}, {"begin":"2018-01-08", "end":"2018-01-15", "id":"b"}, {"begin":"2018-03-01", "end":"2018-03-07", "id":"y"}]
每周7天的间隔是这样的。给定一个特定的日期,我想根据该日期提取它的id。例如2018-01-01至2018-01-07将是id a等

但有时可能不存在一周,例如,所有二月周都不存在。所以在这种情况下,如果我想要id,比如2018-02-25,我应该得到下一个最近的组,id y

目前,我得到的日期属于一个确切的组,但不是如果他们失踪或没有找到,如下所示。理想情况下,我希望只循环json数据一次,但我愿意接受一个有效的解决方案

const date = new Date(); //get todays date but care about month and day only
let client_date = new Date(2018, date.getMonth()  , date.getDate());

let data = parsed_data.filter(value => {

    const start_date_parts = value['begin'].split('-');
    const end_date_parts  = value['end'].split('-');

    const start_date = new Date(start_date_parts[0], start_date_parts[1]-1, start_date_parts[2]);
    const end_date = new Date(end_date_parts[0], end_date_parts[1]-1, end_date_parts[2]);

    // compare now client_date

    if (client_date >= start_date && client_date <= end_date){
        return value;
    }


});
const date=新日期()//获得今天的日期,但只关心月份和日期
让客户_date=新日期(2018年,date.getMonth(),date.getDate());
let data=parsed_data.filter(值=>{
const start_date_parts=值['begin'].split('-');
const end_date_parts=值['end'].拆分('-');
常量开始日期=新日期(开始日期部分[0],开始日期部分[1]-1,开始日期部分[2]);
const end_date=新日期(end_date_parts[0],end_date_parts[1]-1,end_date_parts[2]);
//现在比较客户日期

如果在扫描阵列时(client_date>=start_date&&client_date,请记住迄今为止看到的所有组中最接近目标日期的组。这样,如果您用尽搜索,但未找到匹配项,您将知道最接近的组。

const-parsed_data=[{“begin”:“2018-01-01”,“end”:“2018-01-07”,“id”:“a”},{“begin”:“2018-01-08”,“end”:“2018-01-15”,“id”:“b”},{“begin”:“2018-03-01”,“end”:“2018-03-07”,“id”:“y”}]
让客户_日期=新日期(2018年1月2日);
let data=parsed_data.filter(值=>{
const end_date_parts=值['end'].拆分('-');
const end_date=新日期(end_date_parts[0],end_date_parts[1]-1,end_date_parts[2]);
//现在比较客户日期

如果(client_date,则应通过添加
.getTime()
来计算传递的日期时间之间的差异,以获得时间戳值

让解析的_数据=[
{“开始”:“2018-01-01”,“结束”:“2018-01-07”,“id”:“a”},
{“开始”:“2018-01-08”,“结束”:“2018-01-15”,“id”:“b”},
{“开始”:“2018-03-01”,“结束”:“2018-03-07”,“id”:“y”}
];
const date=new date();//获取今天的日期,但只关心月份和日期
让client_date=新日期(2018,date.getMonth(),date.getDate()).getTime();
//设置默认值
设i=解析的_数据[0];
//在10年内将diff设置为timediff
设差值=60*60*24*365*10000;
//循环数据
解析的_data.forEach(函数(值、索引){
让start_date_parts=value['begin'].split('-');
让end_date_parts=value['end'].split('-');
让开始日期=新日期(开始日期部分[0],开始日期部分[1]-1,开始日期部分[2])。getTime();
让end_date=new date(end_date_parts[0],end_date_parts[1]-1,end_date_parts[2])。getTime();
if(Math.abs(开始日期-客户日期)console.log('id:'+i['id'])//您需要的id
当然是空的。因为正如您所说的“有时一周可能不存在。因此,在这种情况下,获取下一个最近的组。”解析的_数据中没有下一个最近的组。最后一个结束日期是2018-03-07,输入是2018-12-2。这似乎返回了所有小于客户端_日期的日期。因此,在我的真实JSON中,我有40周的时间,现在有31个数组元素——所有这些元素的结束日期都小于结束日期。请用一些替换过滤器。解析的_数据。过滤器到解析的_数据。所以我。“某些”在出现真实情况时尽快中断。嗨…为什么要执行10年?它按预期工作,但我在开始时错过了10年的差异。@samsam我只需要一个大数字来比较差异值与:-)这可能是一个很大的数字,但我认为10年应该可以省下来。谢谢斯科特…我有这个想法,但把代码变成另一个故事