如何解决在具有多个键的对象数组中查找最近的数字
我不使用数字的平面数组,我需要数字的上下文,即它是起点还是终点。
我对如何评估哪个数字最接近特定数字感到困惑。
const dataStructure = [{
uid: "123",startTime: 2,endTime: 6
},{
uid: "345",startTime: 9,endTime: 15
}]
我在拖动时跟踪节点的坐标,向左移动时要评估的数字是它的 x
坐标,向右移动时我正在跟踪 x
坐标加上宽度。无论哪种方式,都会生成一个数字,我正在尝试评估哪个点最接近我的数字。它可以是 startTime 或 endTime。
但我需要知道它是否是开始/结束以及匹配元素的 uid。
我正在尝试将减速器的逻辑放在我的脑海中,但无法完全弄清楚
const updatingTime = 6.7;
// Todo: Out of the two elements,which one is the closest,and which edge is the closest i.e start or end?
dataStructure.reduce((acc: any,curr: any) => {
const lastEnd = acc.endTime;
const lastStart = acc.startTime;
const currEnd = curr.endTime;
const currStart = curr.startTime;
// find the node with either start or end closest to 6.7
// also return key that was the best match i.e startTime/endTime
return curr;
});
// if our number is 6.7 then uid: "123" is our answer with "end" being the edge
解决方法
您可以通过找到开始时间和结束时间之间的最小差异来找到最小距离。
const data = [
{ uid: "123",startTime: 2,endTime: 6 },{ uid: "345",startTime: 9,endTime: 15 }
];
const findClosest = (data,deltaFn,target) =>
data.reduce((prev,curr) =>
deltaFn(curr,target) - deltaFn(prev,target) < 0 ? curr : prev);
const minDiff = ({ startTime,endTime },target) =>
Math.min(Math.abs(startTime - target),Math.abs(endTime - target));
const closest = findClosest(data,minDiff,6.7);
console.log(closest);
.as-console-wrapper { top: 0; max-height: 100% !important; }
这是我遵循@bearacuda13 建议简化解决方案的解决方案
const closest = ({ key,items }: any) =>
items.reduce((acc: any,curr: any) =>
Math.abs(curr[key] - updatingTime) < Math.abs(acc[key] - updatingTime) ? curr : acc
);
const findClosestStart = closest({ key: "startTime",items: closestEls });
const findClosestEnd = closest({ key: "endTime",items: closestEls });
const a = Math.abs(findClosestStart.startTime - updatingTime);
const b = Math.abs(findClosestEnd.endTime - updatingTime);
const which = a < b ? findClosestStart : findClosestEnd;
console.log({ which });
似乎这对性能和/或边缘情况不太确定。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。