Remove closest points in Javascript

I have two arrays, for example, A and B. A is a master array and B is a child array. A and B both contain centroid points or x and `y’ values. I want to remove all the closest points of B from A. For more clarity, for each element of B you find the closest element in A and remove it.

Any help will be highly appreciated. I am new to JavaScript.

Please find the example below for clarity.

const A = [{
    x: 58,
    y: 62.60,
  },
  {
    x: 52,
    y:196,
  },
  {
    x: 167,
    y: 143.601,
  },
  {
    x:178,
    y: 183,
  },
];

const B = [{
    x: 57,
    y: 61.60,
  },
  {
    x: 50,
    y:196,
  },
];

Expected Answer:

const A = [{
        x: 167,
        y: 143.601,
      },
      {
        x:178,
        y: 183,
      },
    ];

>Solution :

Break the problem into smaller parts.

First, write a function to check the distance between 2 points.

const distance = (a, b) => {
    return Math.hypot(a.x - b.x, a.y - b.y);
};

Then write a function to find the position of the smallest distance in a list of points, given a target point.

const findClosestIndex = (list, point) => {
    const distances = list.map((listPoint) => {
        return distance(listPoint, point);
    });
    const min = Math.min(...distances);
    return distances.findIndex((p) => {
        return p === min;
    });
};

Finally, remove all the points that you want to remove.

const A = [
    { x: 58, y: 62.6 },
    { x: 52, y: 196 },
    { x: 167, y: 143.601 },
    { x: 178, y: 183 },
];

const B = [
    { x: 57, y: 61.6 },
    { x: 50, y: 196 },
];

const AWithClosestToBRemoved = B.reduce((result, point) => {
    const closestIndex = findClosestIndex(result, point);
    return result.filter((_, i) => {
        return i !== closestIndex;
    });
}, A);

Edit History

  • Changed more verbose math into Math.hypot based on suggestion in comments.

Leave a Reply