@z_u_q

Как сравнить координаты, которые приходят из двух массивов, между собой?

Есть ссылки - "Адрес метки 1" и "Адрес метки 2", при клике на которые карта центрируется относительно метки 1 или 2. Хочу сделать так, чтобы при клике на "Адрес метки 1" или "Адрес метки 2" открывалось соответствующие описание метки.

По сути получается - address-position мне приходит массив со всеми координатами и из map-balloonContent также приходит массив со всеми координатами. Тут хочу сравнивать элементы этого массива. И если при клике на ссылку (например, "Адрес метки 1") совпадает с координатой метки, то открыть это описание метки.

Пробовал сделать так, но не получилось.

elem.on('clickAddress', function(e, coord) {
	var result = [];
	coordinates.forEach( function (element) {
	    if ( !~coord.indexOf(element) ) {
	    	result.push(element); 
	    	console.log(result);
	    	placemark.balloon.open();
	    }
	});
});

Ссылка на пример
  • Вопрос задан
  • 372 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Яндекс.Карты
Что-то вы переусложнили, всё гораздо проще:

if (coord.every((n, i) => n === coordinates[i])) {
  placemark.balloon.open();
}

Но вообще, надо переписывать - у вас там обработчик события clickAddress назначается несколько раз, хотя достаточно и одного (да и в целом - многословно как-то). Например, так:

const placemarks = elem.find('.map-balloonContent').get().map(n => createPlacemark({
  coord: $(n).data('coord'),
  content: $(n).html(),
}));
placemarks.forEach(n => myMap.geoObjects.add(n));
placemarks[0].balloon.open();

elem.on('clickAddress', function(e, coord) {
  placemarks.find(n => n.geometry.getCoordinates().every((m, i) => m === coord[i])).balloon.open();
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Откажитесь от ФорИч, разделите метод на две логических части - поиск и действие. Я не уверен, что у вас и как работает (может там нельзя сравнивать через indexOf, хотя вы и сравниваете)

function matches (point, target) {
  return point === target; // тут надо правильное условие написать
}

function findIn (coordinates, target) {
  for (var i = 0; i < coordinates.length; i++) {
    if (matches(coordinates[i], target)) return coordinates[i];
  }

  return null;
}

elem.on('clickAddress', function(e, coord) {
  const result = findIn( coordinates, coord );
  if (result) {
      	placemark.balloon.open();
  }
});


Я знаю, что у вас не совсем та логика, но стараюсь передать идею. Если можно открыть одновременно нескоьлко балунов - возвращайте массив. Пока у вас непонятное что-то написано. Особенно не хватает типизации, например, что находится в переменной coord - совершенно непонятно, что вы её indexOf вызываете.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы