在具有多个键的对象数组中查找最近的数字

如何解决在具有多个键的对象数组中查找最近的数字

我不使用数字的平面数组,我需要数字的上下文,即它是起点还是终点。

我对如何评估哪个数字最接近特定数字感到困惑。

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?