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



所以我的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;
    }

});

对于在 JSON 数据中具有组表示形式的日期,它按预期工作,但对于其他日期则不然。有什么想法吗?

您应该计算传递的日期时间之间的差值,将.getTime()相加以获取时间戳值。

let 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"}
];
const date = new Date(); //get todays date but care about month and day only
let client_date = new Date(2018, date.getMonth()  , date.getDate()).getTime();
// Set default
let i = parsed_data[0];
// Set diff to timediff in 10 years
let diff = 60*60*24*365*10000;
// Loop the data
parsed_data.forEach(function(value, index) {
    let start_date_parts = value['begin'].split('-');
    let end_date_parts  = value['end'].split('-');
    let start_date = new Date(start_date_parts[0], start_date_parts[1]-1, start_date_parts[2]).getTime();
    let end_date = new Date(end_date_parts[0], end_date_parts[1]-1, end_date_parts[2]).getTime();
      
    if (Math.abs(start_date - client_date) < diff) {
      diff = Math.abs(start_date - client_date); // set new diff value
      i = parsed_data[index];
    }
  
    if (Math.abs(end_date - client_date) < diff) {
      diff = Math.abs(start_date - client_date); // set new diff value
      i = parsed_data[index];
    }
});
console.log(i); // the closest datetime
console.log('The id: ' + i['id']) // the id you need

扫描阵列时,请记住到目前为止看到的所有组中最接近目标日期的组。 这样,如果您穷尽搜索并且没有找到匹配项,您就会知道哪个是最接近的。

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"}]
let client_date = new Date(2018, 1, 2);
let data = parsed_data.filter(value => {
    const end_date_parts  = value['end'].split('-');
    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 <= end_date){
        return value;
    }
});
console.log(data);

最新更新