Используйте значение функции, которая находится внутри each. функция для .каждая функция (jQuery)

#javascript #jquery

#javascript #jquery

Вопрос:

Следующая часть моей функции должна показывать расстояние между множеством координат широты / lng. Это работает идеально, до « console.log(dist) » части ниже, но я не могу вывести эти значения из «dist» в каждый html « i «.

 $(".box").each(function() {
    var latlng = $(this).find('.area').data('latlng').split(',');
    var lat1 = latlng[0];
    var lon1 = latlng[1];
    var lat2 = location_lat.toFixed(8);
    var lon2 = location_lon.toFixed(8);
    
    distance(lat1, lon1, lat2, lon2, "K"); // <-- start calculate function
    
    function distance(lat1, lon1, lat2, lon2, unit) {
        if ((lat1 === lat2) amp;amp; (lon1 === lon2)) {
            return 0;
        }
        else {
            var radlat1 = Math.PI * lat1/180;
            var radlat2 = Math.PI * lat2/180;
            var theta = lon1-lon2;
            var radtheta = Math.PI * theta/180;
            var dist = Math.sin(radlat1) * Math.sin(radlat2)   Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
            
            if (dist > 1) {
                dist = 1;
            }
            
            dist = Math.acos(dist);
            dist = dist * 180/Math.PI;
            dist = dist * 60 * 1.1515; // M = statute miles (default)
            if (unit === "K") { dist = dist * 1.609344; } // K = kilometers
            if (unit === "N") { dist = dist * 0.8684; } // N = nautical miles

            console.log(dist); // <-- works perfect, I got all the different values
            
            var display = $(this).find('.area');
            $(display).find('i').html(dist.toFixed(0)).append(" <em>km</em>"); // <-- doesn´t work, just empty "i"
        }
    }
    
});
  

Я также пытался:

 ...
distance(lat1, lon1, lat2, lon2, "K"); // <-- start calculate function

var display = $(this).find('.area');
$(display).find('i').html(dist.toFixed(0)).append(" <em>km</em>"); // <-- doesn´t work, because "dist" is not defined
  

… но тогда «dist» больше не будет работать (ошибка: диск не определен). Что не так с моей функцией « .each «? Как я могу получить значения из «функции расстояния» обратно в .each функциональную часть?

Ответ №1:

Поместите distance() функцию за пределы цикла и позвольте ей возвращать вычисленное значение.

 function distance(lat1, lon1, lat2, lon2, unit) {
    if (lat1 === lat2 amp;amp; lon1 === lon2) return 0;

    var radlat1 = Math.PI * lat1/180;
    var radlat2 = Math.PI * lat2/180;
    var theta = lon1-lon2;
    var radtheta = Math.PI * theta/180;
    var dist = Math.sin(radlat1) * Math.sin(radlat2)   Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
    
    if (dist > 1) dist = 1;
    
    dist = Math.acos(dist);
    dist = dist * 180/Math.PI;
    dist = dist * 60 * 1.1515; // M = statute miles (default)
    if (unit === "K") { dist = dist * 1.609344; } // K = kilometers
    if (unit === "N") { dist = dist * 0.8684; } // N = nautical miles
    
    return dist;
}

$(".box").each(function() {
    var latlng = $(this).find('.area').data('latlng').split(',');
    var dist = distance(
        latlng[0],
        latlng[1],
        location_lat.toFixed(8),
        location_lon.toFixed(8),
        "K"
    );

    $(this).find('.area i').text(dist.toFixed(0)).append(" <em>km</em>");
});
  

Комментарии:

1. Большое спасибо за помощь! Вы правы, работает идеально! В вашем коде всего две небольшие ошибки, если я прав. «return 0;» должно быть «{return 0;}» и «dist = 1;» должно быть «{dist = 1;}»

2. @Pepe Нет, не обязательно. if (something) return; полностью допустимый Javascript, фигурные скобки не нужны для однострочников, подобных этому. Если вы хотите написать их, вы можете, но это не обязательно.