我有兩個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'}
]
我要怎么實作呢?
uj5u.com熱心網友回復:
1、先將history資料根據name分組:https://blog.csdn.net/weixin_36339245/article/details/1035229982、遍歷now資料,根據name找到history中的list,回圈,計算兩個時間差最小的那條資料(存兩個臨時變數,minTime-最小時間差,item-最小時間差對應的history資料)
uj5u.com熱心網友回復:
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) // 結果
uj5u.com熱心網友回復:
// 這樣才對
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) // 結果
uj5u.com熱心網友回復:
我運行的時候,出錯,Uncaught TypeError: Cannot read property 'time' of undefined
at test.html:27
uj5u.com熱心網友回復:
需要加判斷,有可能data[index - 1] 和data[index + 1] 不存在。不存在你就直接等于另一個。
因為 index 可能會等于 0 或者最大值
uj5u.com熱心網友回復:
// 這樣才對
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) // 結果
uj5u.com熱心網友回復:
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進行分組以后再篩選
uj5u.com熱心網友回復:
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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/232356.html
標籤:JavaScript
上一篇:各位大佬,我在安裝serverless出現了問題,望解答
下一篇:vue打包問題 求助求助 大佬們
