问题
在做项目的过程中需要根据时间绘制折线图,但由于数据不连续,所以后端返回的数据会有一些时间片段有缺失,在画图的时候需要把这些缺失时间补充完成,并给他们赋空值
解决方法
思路很简单,就是遍历已有数据,对缺失的时间数据进行填充
// 输入格式
// inputData: [{Time: xxx, Value: yyy}]
// timeInterval: [moment(), moment()]
// 使用了moment.js,请自行引入
function solution(inputData,timeInterval) {
const start = timeInterval[0].clone()
const end = timeInterval[1].clone()
const data = []
let timeLevel = ''
let interval = 5
let timeConf = {}
let sum = 0
let isSave = true
if (end.diff(start, 'days') <= 1) {
timeConf = { second: 0 }
timeLevel = 'minutes'
interval = 5
} else {
timeConf = { hour: 0, minute: 0, second: 0 }
timeLevel = 'days'
interval = 1
}
start.set(timeConf)
end.set(timeConf)
const dataFormatStr = `YYYY-MM-DD${timeLevel === 'days' ? '' : ' HH:mm:00'}`
const temp = start
for (let i = 0; i < inputData.length;) {
const diff = temp.diff(moment(inputData[i].Time), timeLevel)
if (diff < 0) {
const t = temp.format(dataFormatStr)
let value = 0
if (!isSave) {
value = sum
isSave = true
sum = 0
}
data.push({
Time: t,
Value: value,
})
temp.add(interval, timeLevel)
} else {
if (diff < interval && diff > 0) {
sum += inputData[i].Value
isSave = false
} else {
if (diff === 0) {
sum += inputData[i].Value
}
data.push({
Time: temp.format(dataFormatStr),
Value: sum,
})
isSave = true
sum = diff === 0 ? 0 : inputData[i].Value
temp.add(interval, timeLevel)
}
i += 1
}
}
if (!isSave) {
data.push({
Time: temp.format(dataFormatStr),
Value: sum,
})
temp.add(interval, timeLevel)
}
while (temp.diff(end, timeLevel) <= 0) {
data.push({
Time: temp.format(dataFormatStr),
Value: 0,
})
temp.add(interval, timeLevel)
}
return data
}