如何从数组中获得最接近的值

How to get nearest value from Array?

本文关键字:最接近 数组      更新时间:2023-09-26

我有一个像这样的数组:

var array = [{top: 5, left: 50}, {top: 12, left: 44}, {top: 60, left: 11}]

我需要在这个数组中找到最接近topleft,如果我知道:

var findNearest = {top:10, left:40}; //never be bigger than +5 (or lower than -5)

例如,在这种情况下,它应该返回第二个,因为top: 12在我的findNearest对象中接近top:10,并且差异不大于5。left也是一样

如何?

编辑

我的想法是创建for循环并检查每个对象是否与我想要找到的对象具有相同的值。如果没有,重复for循环,增加+1的值。

my bad idea:

var increaseTop = true;
var increaseLeft = true;
function find(obj){
    for(var i = 0; i < array.length; i++){
        if(array[i].top == obj.top){
            // found nearest .top, not increase by 1
            increaseTop = false;
        }
        if(array[i].left == obj.left){
            // found nearest .left, not increase by 1
            increaseLeft = false;
        }
    } 
    // here repeat for loop if is increaseLeft OR increaseTop is true
    // with increased values .top and .left
}
findNearest({top:10, left:40});

计算每段距离并得到最小值:

var array = [{top: 5, left: 50}, {top: 12, left: 44}, {top: 60, left: 11}]
var findNearest = getNearest({top:10, left:40}, array);
console.log(findNearest);
function getDistance(p1, p2) {
  var a = p2.top - p1.top;
  var b = p2.left - p1.left;
  return Math.sqrt(a*a + b*b);
}
function getNearest(point, points) {
  var min = Number.POSITIVE_INFINITY,
      minIndex;
  var dist;
  for(var i = 0 ; i < points.length; i++) {
    dist = getDistance(point, points[i]);
    if(dist < min) {
      min = dist;
      minIndex = i;
    }
  }
  return points[minIndex];
}