@nastinapetrova555

Как упростить код на поиск минимальной дистанции между точками?

Решила задачу, но мне кажется, что слишком сложно...в задаче указано, что можно решить без деструктуризации, но я пока не вижу, как.
Условие: Реализуйте функцию getTheNearestLocation(), которая находит ближайшее место к указанной точке на карте и возвращает его.
Параметры функции:
  • locations – массив мест на карте. Каждое место - это массив из двух элементов, где первый элемент это название места, второй – точка на карте (массив из двух чисел x и y).
  • point – текущая точка на карте. Массив из двух элементов-координат x и y.

//Пример данных и вывода
const locations = [
  ['Park', [10, 5]],
  ['Sea', [1, 3]],
  ['Museum', [8, 4]],
];
 
const currentPoint = [5, 5];
 
// Если точек нет, то возвращается null
getTheNearestLocation([], currentPoint); // null
getTheNearestLocation(locations, currentPoint); // ['Museum', [8, 4]]


//РЕШЕНИЕ
const getTheNearestLocation = (locations, currentPoint) => {
if (locations.length === 0) {
  return null; 
  } 
  
function getDistance([x2, y2], [x1, y1]) {
    let distance = Math.sqrt(Math.abs(x2 - x1)**2 + Math.abs(y2 - y1)**2); //теорема Пифагора
    return distance;
  };

let arrOfDistances = [];
let [x2, y2] = currentPoint;
  
function arrOfDistance(locations) {
let i;
  for (i = 0; i < locations.length; i++) {
    let [place, [x1, y1]] = locations[i];
    let distanceToEach = getDistance([x1, y1], [x2, y2]);
    arrOfDistances.push(distanceToEach);
  }
  return arrOfDistances;
  };
  arrOfDistance(locations);

  let min;
function minDistance(arrOfDistances) {
    for (let i = 0; i < arrOfDistances.length - 1; i++) {
      if (arrOfDistances[i] > arrOfDistances[i + 1]) {
        min = arrOfDistances[i + 1];
      } else {
        min = arrOfDistances[i];
      }
    }
    return min;
  };
  minDistance(arrOfDistances);
  
  let index = arrOfDistances.indexOf(min);
  let result = locations[index];
  return result;
};
  • Вопрос задан
  • 1099 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Вместо массива расстояний до заданной точки достаточно хранить одно минимальное. При обработке элемента locations вычисляете расстояние, сравниваете с текущим минимальным, если оно всё ещё меньше - ничего не делаете, в противном случае запоминаете новое минимальное и соответствующий ему элемент массива locations:

const getTheNearestLocation = (locations, [ x, y ]) =>
  locations.reduce((nearest, n) => {
    const d = ((n[1][0] - x) ** 2 + (n[1][1] - y) ** 2) ** 0.5;
    return nearest[1] < d ? nearest : [ n, d ];
  }, [ null, Infinity ])[0];
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Gruf1
export const getTheNearestLocation = (locations, currentPoint) => {
if (locations.length === 0) {
return null;
}

let [nearestLocation] = locations;
const [, nearestPoint] = nearestLocation;
let lowestDistance = getDistance(currentPoint, nearestPoint);

for (const location of locations) {
const [, point] = location;
const distance = getDistance(currentPoint, point);
if (distance < lowestDistance) {
lowestDistance = distance;
nearestLocation = location;
}
}

return nearestLocation;
};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы