js如何判断两个时间最接近

cyyjm 2020-12-09 02:31:56
我有两个json,一个是实时数据

jsonNow=[
{'value':'1.77','time':'2020-12-09 14:32:00','name':'A'},
{'value':'1.77','time':'2020-12-09 14:37:00','name':'B'}
]

一个是历史数据,数据比较多,我只截取其中一小部分,格式如下:

jsonHistory =
[
{'value':'1.78','time':'2020-12-08 14:31:00','name':'A'},
{'value':'1.76','time':'2020-12-08 14:35:00','name':'A'},
{'value':'1.79','time':'2020-12-08 14:36:00','name':'A'},
{'value':'1.71','time':'2020-12-08 14:31:00','name':'B'},
{'value':'1.66','time':'2020-12-08 14:35:00','name':'B'},
{'value':'1.69','time':'2020-12-08 14:36:00','name':'B'}
]
现在我想根据jsonNow里的name,找到昨天时间最接近的一条数据,
就像现在,我想找到

[
{'value':'1.78','time':'2020-12-08 14:31:00','name':'A'},
{'value':'1.69','time':'2020-12-08 14:36:00','name':'B'}
]
我要怎么实现呢?
...全文
2648 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡鱼_ 2020-12-10
  • 打赏
  • 举报
回复
呃,上面是ts的。

const jsonNow = [
    {'value': '1.77', 'time': '2020-12-09 14:32:00', 'name': 'C'},
    {'value': '1.77', 'time': '2020-12-09 14:37:00', 'name': 'B'}
];
const jsonHistory = [
    {'value': '1.78', 'time': '2020-12-08 14:31:00', 'name': 'A'},
    {'value': '1.76', 'time': '2020-12-08 14:35:00', 'name': 'A'},
    {'value': '1.79', 'time': '2020-12-08 14:36:00', 'name': 'A'},
    {'value': '1.66', 'time': '2020-12-08 14:35:00', 'name': 'B'},
    {'value': '1.71', 'time': '2020-12-08 14:31:00', 'name': 'B'},
    {'value': '1.69', 'time': '2020-12-08 14:36:00', 'name': 'B'}
];

/**
 * @description 将jsonHistory以name进行分组,以便于快速查找
 * @param {*} data jsonHistory
 * @returns {*} 分组结果
 */
function groupByName(data) {
    let group = {};
    data.forEach(item => {
        const key = item.name;
        group[key] = group[key] || [];
        group[key].push(item);
    });
    return group;
};

/**
 * @description 将时间部份换算为秒
 * @param {string} strDate 待转换的时间部份
 * @returns {number} 换算结果
 */
function calcSeconds(strDate) {
    const iDate = new Date(strDate);
    return iDate.getHours() * 3600 + iDate.getMinutes() * 60 + iDate.getSeconds();
};

//history以name分组
const hisGroup = groupByName(jsonHistory);

//最终结果
let res = [];

//遍历jsonNow,查找最接近的时间
jsonNow.forEach(item => {
    if(hisGroup[item.name]) {
        const his = hisGroup[item.name].sort((a, b) => {
            const nTime = calcSeconds(item.time);
            const aTime = calcSeconds(a.time);
            const bTime = calcSeconds(b.time);
            return Math.abs(nTime - aTime) - Math.abs(nTime - bTime)
        })[0];
        res.push(his);
    }
});
console.log(res);
泡泡鱼_ 2020-12-10
  • 打赏
  • 举报
回复
所以,你只是要比较后面的时间部份而已……

const jsonNow = [
    {'value': '1.77', 'time': '2020-12-09 14:32:00', 'name': 'C'},
    {'value': '1.77', 'time': '2020-12-09 14:37:00', 'name': 'B'}
];
const jsonHistory = [
    {'value': '1.78', 'time': '2020-12-08 14:31:00', 'name': 'A'},
    {'value': '1.76', 'time': '2020-12-08 14:35:00', 'name': 'A'},
    {'value': '1.79', 'time': '2020-12-08 14:36:00', 'name': 'A'},
    {'value': '1.66', 'time': '2020-12-08 14:35:00', 'name': 'B'},
    {'value': '1.71', 'time': '2020-12-08 14:31:00', 'name': 'B'},
    {'value': '1.69', 'time': '2020-12-08 14:36:00', 'name': 'B'}
];

/**
 * @description 将jsonHistory以name进行分组,以便于快速查找
 * @param {*} data jsonHistory
 * @returns {*} 分组结果
 */
function groupByName(data: {value: string, time: string, name: string}[]): {[key: string]: {value: string, time: string, name: string}[]} {
    let group = {};
    data.forEach(item => {
        const key = item.name;
        group[key] = group[key] || [];
        group[key].push(item);
    });
    return group;
}

/**
 * @description 将时间部份换算为秒
 * @param {string} strDate 待转换的时间部份
 * @returns {number} 换算结果
 */
function calcSeconds(strDate: string): number {
    const iDate = new Date(strDate);
    return iDate.getHours() * 3600 + iDate.getMinutes() * 60 + iDate.getSeconds();
}

//history以name分组
const hisGroup = groupByName(jsonHistory);

//最终结果
let res: {value: string, time: string, name: string}[] = [];

//遍历jsonNow,查找最接近的时间
jsonNow.forEach(item => {
    if(hisGroup[item.name]) {
        const his = hisGroup[item.name].sort((a, b) => {
            const nTime = calcSeconds(item.time);
            const aTime = calcSeconds(a.time);
            const bTime = calcSeconds(b.time);
            return Math.abs(nTime - aTime) - Math.abs(nTime - bTime)
        })[0];
        res.push(his);
    }
});
console.log(res);
@老人与海鲜 2020-12-10
  • 打赏
  • 举报
回复
我写了一个,送女友的生日礼物 --->(3D相册,樱花雨-带音乐) https://blog.csdn.net/qq316148300/article/details/110792575
cyyjm 2020-12-10
  • 打赏
  • 举报
回复
引用 7 楼 泡泡鱼_ 的回复:
A最接近的为什么是: {'value':'1.78','time':'2020-12-08 14:31:00','name':'A'}?不应该是{'value':'1.79','time':'2020-12-08 14:36:00','name':'A'}吗? 你这“找到昨天时间最接近的一条数据”中的“时间最接近”是什么意思?按我理解的:相同Name中History时间最接近Now的,应该是History最晚的那个时间呀 但有一点:#1朋友说的,jsonHistory最好是先按name进行分组以后再筛选
就拿这个例子来说,我现在的时间是14:32分, jsonHistory有3个时间,分别是31,35,36。 31分距离32分差 一分钟,35分距离32分差 3分钟,36分距离32分差 4分钟,对于我来说,当然差一分钟最接近今天的时间啊。
HH55HH55HH 2020-12-10
  • 打赏
  • 举报
回复
转成long,日期相减
BaoBBBB 2020-12-09
  • 打赏
  • 举报
回复
var jsonNow=[ {'value':'1.77','time':'2020-12-09 14:32:00','name':'A'}, {'value':'1.77','time':'2020-12-09 14:37:00','name':'B'} ]; var jsonHistory = [ {'value':'1.78','time':'2020-12-08 14:31:00','name':'A'}, {'value':'1.76','time':'2020-12-08 14:35:00','name':'A'}, {'value':'1.79','time':'2020-12-08 14:36:00','name':'A'}, {'value':'1.71','time':'2020-12-08 14:31:00','name':'B'}, {'value':'1.66','time':'2020-12-08 14:35:00','name':'B'}, {'value':'1.69','time':'2020-12-08 14:36:00','name':'B'} ]; var newJson = []; jsonNow.forEach(obj=>{ var data = jsonHistory.filter(v => v.name == obj.name && new Date(v.time).getYear()==new Date(new Date(obj.time)-1000*60*60*24).getYear()&& new Date(v.time).getMonth()==new Date(new Date(obj.time)-1000*60*60*24).getMonth()&& new Date(v.time).getDate()==new Date(new Date(obj.time)-1000*60*60*24).getDate()) var index = 0; var tagerindex = 0; var min_diff = 99999; var cur_date = new Date(obj.time); data.forEach(function(d){ var d_date = new Date(d.time); if(d_date.getHours()==cur_date.getHours()){ if(Math.abs(d_date.getMinutes()-cur_date.getMinutes())<min_diff){ tagerindex = index; min_diff = Math.abs(d_date.getMinutes()-cur_date.getMinutes()); } }else if(d_date.getHours()>cur_date.getHours()){ if(Math.abs(60-cur_date.getMinutes()+(d_date.getHours()-cur_date.getHours()+1)*60+d_date.getMinutes())<min_diff){ tagerindex = index; min_diff = Math.abs(60-cur_date.getMinutes()+(d_date.getHours()-cur_date.getHours()+1)*60+d_date.getMinutes()); } }else if(d_date.getHours()<cur_date.getHours()){ if(Math.abs(60-d_date.getMinutes()+(cur_date.getHours()-d_date.getHours()+1)*60+cur_date.getMinutes())<min_diff){ tagerindex = index; min_diff = Math.abs(60-d_date.getMinutes()+(cur_date.getHours()-d_date.getHours()+1)*60+cur_date.getMinutes()); } } index++; }); newJson.push(data[tagerindex]); }); console.log(newJson);
泡泡鱼_ 2020-12-09
  • 打赏
  • 举报
回复
A最接近的为什么是: {'value':'1.78','time':'2020-12-08 14:31:00','name':'A'}?不应该是{'value':'1.79','time':'2020-12-08 14:36:00','name':'A'}吗? 你这“找到昨天时间最接近的一条数据”中的“时间最接近”是什么意思?按我理解的:相同Name中History时间最接近Now的,应该是History最晚的那个时间呀 但有一点:#1朋友说的,jsonHistory最好是先按name进行分组以后再筛选
weixin_50944805 2020-12-09
  • 打赏
  • 举报
回复



// 这样才对
var obj= {'value':'1.77','time':'2020-12-09 14:32:00','name':'A'};
jsonHistory.push(obj)
var data = jsonHistory.filter(v  => v.name == obj.name).sort( (a, b) => new Date(b.time).getTime() - new Date(a.time).getTime() )
var index = data.map(v => v.time).indexOf(obj.time)
var res = obj
if(index == 0){ // 排除可能是第一个
  res = data[index+1]
}else if(index == data.length - 1){ // 排除可能是最后一个
  res = data[index - 1]
}else if(index != 0 &&  index != data.length - 1){ // 排除可能是只有自身
   var num1 = Math.abs( new Date(data[index - 1].time).getTime() -  new Date(obj.time).getTime() )
   var num2 = Math.abs( new Date(data[index + 1].time).getTime() -  new Date(obj.time).getTime() )
   res = num1 > num2 ? data[index + 1] : data[index - 1]
}


console.log(res) // 结果





weixin_50944805 2020-12-09
  • 打赏
  • 举报
回复
需要加判断,有可能data[index - 1] 和data[index + 1] 不存在。 不存在你就直接等于另一个。 因为 index 可能会等于 0 或者最大值
cyyjm 2020-12-09
  • 打赏
  • 举报
回复
引用 3 楼 weixin_50944805 的回复:
[quote=引用 2 楼 weixin_50944805 的回复:]

var val = 'A'
var data = jsonHistory.filter(v  => v.name == val).sort( (a, b) => new Date(b.time).getTime() - new Date(a.time).getTime() ).splice(0,2)
console.log(data) // 结果

// 这样才对
var obj= {'value':'1.77','time':'2020-12-09 14:32:00','name':'A'};
jsonHistory.push(obj)
var data = jsonHistory.filter(v  => v.name == obj.name).sort( (a, b) => new Date(b.time).getTime() - new Date(a.time).getTime() )
var index = data.map(v => v.time).indexOf(obj.time)
var num1 = Math.abs( new Date(data[index - 1].time).getTime() -  new Date(obj.time).getTime() )
var num2 = Math.abs( new Date(data[index + 1].time).getTime() -  new Date(obj.time).getTime() )

var res = num1 > num2 ? data[index + 1] : data[index - 1]
console.log(res) // 结果



[/quote] 我运行的时候,出错,Uncaught TypeError: Cannot read property 'time' of undefined at test.html:27
weixin_50944805 2020-12-09
  • 打赏
  • 举报
回复
引用 2 楼 weixin_50944805 的回复:

var val = 'A'
var data = jsonHistory.filter(v  => v.name == val).sort( (a, b) => new Date(b.time).getTime() - new Date(a.time).getTime() ).splice(0,2)
console.log(data) // 结果

// 这样才对
var obj= {'value':'1.77','time':'2020-12-09 14:32:00','name':'A'};
jsonHistory.push(obj)
var data = jsonHistory.filter(v  => v.name == obj.name).sort( (a, b) => new Date(b.time).getTime() - new Date(a.time).getTime() )
var index = data.map(v => v.time).indexOf(obj.time)
var num1 = Math.abs( new Date(data[index - 1].time).getTime() -  new Date(obj.time).getTime() )
var num2 = Math.abs( new Date(data[index + 1].time).getTime() -  new Date(obj.time).getTime() )

var res = num1 > num2 ? data[index + 1] : data[index - 1]
console.log(res) // 结果



weixin_50944805 2020-12-09
  • 打赏
  • 举报
回复

var val = 'A'
var data = jsonHistory.filter(v  => v.name == val).sort( (a, b) => new Date(b.time).getTime() - new Date(a.time).getTime() ).splice(0,2)
console.log(data) // 结果
杨树叶子0526 2020-12-09
  • 打赏
  • 举报
回复
1、先将history数据根据name分组:https://blog.csdn.net/weixin_36339245/article/details/103522998 2、遍历now数据,根据name找到history中的list,循环,计算两个时间差最小的那条数据(存两个临时变量,minTime-最小时间差,item-最小时间差对应的history数据)

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧