如何获取最新Y值?现有代码无法实现需求,寻求技术指导
问题:如何获取符合时间范围的最新Y值
需求说明:当当前Y为空时,1)若最近10秒内有历史Y值,则使用其中最新的Y值;2)若最近10秒内无有效数据(即历史数据时间戳超过10秒),则显示'*'。
用户尝试的代码
// 获取当前时间戳往前推10秒的时间戳 var dateTime = new Date(timestamp); dateTime.setSeconds(dateTime.getSeconds() - 10); var previousTenSecondsFromTimestamp = dateTime.getTime() // 尝试获取时间范围内的Y数据 let data = s.groupedData.find(el => el.x >= previousTenSecondsFromTimestamp ) && s.groupedData.find(el => el.x <= timestamp) // 决定返回结果 let res = (data != null) ? Data.y: "*"; return res;
数据结构示例
[ { "x": 1694192563868, "Y":1}, { "x": 1694192563874, "Y":3 }, { "x": 1694192563888, "Y":8 }, { "x": 1694192563892, "Y":4 } ]
问题分析与修正方案
原代码存在几个关键问题:
- 两次
find加&&的逻辑错误:第一次find返回第一个符合10秒内条件的元素,第二次find返回第一个不超过当前时间的元素,两者无法定位到最新数据 - 未筛选出所有时间范围内的数据,也没有从中选取时间戳最大的最新条目
- 变量名大小写错误:
Data.y应为data.y
修正后的代码如下:
// 计算10秒前的时间戳 const dateTime = new Date(timestamp); dateTime.setSeconds(dateTime.getSeconds() - 10); const previousTenSeconds = dateTime.getTime(); // 筛选出所有在时间范围内的数据 const validData = s.groupedData.filter(el => el.x >= previousTenSeconds && el.x <= timestamp); let res; if (validData.length > 0) { // 从有效数据中找出时间戳最大(最新)的条目 const latestData = validData.reduce((prev, curr) => curr.x > prev.x ? curr : prev); res = latestData.Y; // 注意数据结构中是大写的Y } else { // 无有效数据时返回* res = "*"; } return res;
代码说明
- 用
filter筛选出所有符合时间范围的历史数据 - 用
reduce遍历有效数据,找出时间戳x最大的最新条目 - 根据是否有有效数据,返回对应的Y值或'*'
内容的提问来源于stack exchange,提问作者So25
相关产品推荐
相关产品推荐

