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