我有两个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'}
]
我要怎么实现呢?
###把时间转成时间戳,做减法,哪两个之间的绝对值最小,那他们必然是最接近的。
###const result = [];
jsonNow.forEach(nowDate => {
const nowTime = new Date(nowDate.time).getTime();
let min = Number.MAX_SAFE_INTEGER;
let minIndex = 0;
jsonHistory.forEach((history, index) => {
const historyTime = new Date(history.time).getTime();
if (Math.abs(nowTime - historyTime) < min && nowDate.name === history.name) {
min = Math.abs(nowTime - historyTime);
minIndex = index;
}
});
result.push(jsonHistory[minIndex]);
});
console.log(result);
但是有个问题是如果 history 有重复的值只能加一次
###其实你这个是比较简单的,是数据的过滤比较,比较的参数实质有2个
- 是name相同
- 是time差最小
现在有了当前数据,直接可以提取name,然后分别对应比较time差
又因为time差是标准的时间格式数据(可以用new Date('时间格式数据')
获得一个date对象),date对象有唯一的UTC值,这个值可以直接比较大小,也可以计算绝对差值,又因为明确了当前时间是比以往时间大的数,则用当前时间的UTC去减以往的UTC,找出差最小的一个即可。