如何在含startTime、endTime的对象数组中查找距指定值最近的时间点及对应信息
实现代码
reduce 的累加器不需要保留上一个元素的时间属性,只需要记录全局最小差值、匹配的uid、匹配的字段即可,逻辑如下:
const dataStructure = [{ uid: "123", startTime: 2, endTime: 6 }, { uid: "345", startTime: 9, endTime: 15 }] const updatingTime = 6.7; const matchResult = dataStructure.reduce((acc, curr) => { // 计算当前元素起止时间和目标值的绝对差值 const startOffset = Math.abs(curr.startTime - updatingTime); const endOffset = Math.abs(curr.endTime - updatingTime); // 取当前元素的最小差值与对应字段 const currMinOffset = Math.min(startOffset, endOffset); const currMatchField = startOffset < endOffset ? 'startTime' : 'endTime'; // 小于全局最小差值则更新累加器 if (currMinOffset < acc.minOffset) { return { minOffset: currMinOffset, uid: curr.uid, matchField: currMatchField } } return acc; }, { minOffset: Infinity, uid: null, matchField: null }); // 测试输出:{ minOffset: 0.7, uid: '123', matchField: 'endTime' } console.log(matchResult);
特殊场景调整
如果出现差值完全相等的情况,可以自行调整匹配优先级:
- 优先匹配startTime:将判断条件
startOffset < endOffset改为startOffset <= endOffset - 优先匹配endTime:保持原判断逻辑即可
内容的提问来源于stack exchange,提问作者Michael Joseph Aubry
相关产品推荐
相关产品推荐

