代码之家  ›  专栏  ›  技术社区  ›  redoc01

如何从目标中找到数组中的壁橱坐标

  •  -1
  • redoc01  · 技术社区  · 2 年前

    这就是数组。我想过滤目标的壁橱x和y坐标,该目标为:

    target.x=310和target.y=280;

    正确的值是数组中数字8处的值。

    我只是一个过滤方案,从最接近目标x和y的数组中过滤出正确的值?

    distFromBall = [
    {y: 10, x: 300, number: 1},
    {y: 23.333333333333314, x: 75, number: 2},
    {y: 23.333333333333314, x: 225, number: 3},
    {y: 23.333333333333314, x: 375, number: 4},
    {y: 23.333333333333314, x: 525, number: 5},
    {y: 270, x: 75, number: 6},
    {y: 270, x: 225, number: 7},
    {y: 270, x: 375, number: 8},
    {y: 270, x: 525, number: 9},
    {y: 290, x: 150, number: 10},
    {y: 290, x: 450, number: 11}]
    

    我试过这样的方法,但没有成功:

        var f = distFromBall.filter(function (a,i) {
            return a.x > 0;
        });
    
        f.sort(function (a, b) {
            return a.x - b.x;
        });
    
        f.sort(function (a, b) {
            return a.y - b.y;
        });
        var num = distFromBall[0].number;
    
        var pl = arrayPlayerHome.find(function (a) {
            return a.shirtNumber == num;
        });
    
        return pl;
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   CertainPerformance    2 年前

    利用勾股定理和 .reduce ,你可以保持最接近 number 对象作为累加器,并在最后返回。

    const getDist = (a, b) => Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);
    const findClosest = (target) => distFromBall
      .reduce((a, item) => getDist(item, target) < getDist(a, target) ? item : a);
    
    const distFromBall = [
    {y: 10, x: 300, number: 1},
    {y: 23.333333333333314, x: 75, number: 2},
    {y: 23.333333333333314, x: 225, number: 3},
    {y: 23.333333333333314, x: 375, number: 4},
    {y: 23.333333333333314, x: 525, number: 5},
    {y: 270, x: 75, number: 6},
    {y: 270, x: 225, number: 7},
    {y: 270, x: 375, number: 8},
    {y: 270, x: 525, number: 9},
    {y: 290, x: 150, number: 10},
    {y: 290, x: 450, number: 11}]
    
    console.log(findClosest({ x: 310, y: 280 }));