Estoy tratando de obtener la coincidencia de la siguiente matriz comparando las coordenadas del navegador con las coordenadas en la matriz, pero obtengo un valor 'indefinido' cuando llamo a la const 'matchgeosucursal' incluso si fuerzo la condición del filtro para hacer coincidir, el objetivo de este código es obtener la URL del escenario de coincidencia, creo que estoy usando mal la función de filtro.
//Request permissions $( document ).ready(function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else { console.log ("Geolocation is not supported by this browser."); } //Filter and gets match url function showPosition(position) { console.log("Latitude: " + position.coords.latitude) console.log("Longitude: " + position.coords.longitude); var navlat = position.coords.latitude; //Browser lat var navlon = position.coords.longitude; // Browser lon // Array var sucursales = [ {lat: 21.924089, lon: -102.293378, url: "https://shorturl.at/test1"}, {lat: 21.859964, lon: -102.298034, url: "https://shorturl.at/test2"}, {lat: 32.45569, lon: -116.836181, url: "https://shorturl.at/test3"}, {lat: 24.114868, lon: -110.340389, url: "https://shorturl.at/test4"}, {lat: 21.0335386, lon: -89.559187, url: "https://shorturl.at/test5"}]; //Match result const matchgeosucursal = sucursales.filter( sucursales => sucursales.lat === navlat && sucursales.lon === navlon); console.log('Match> ' + matchgeosucursal); } });Funciona bien, lo único es que console.log no imprime los objetos correctamente. console.table en mi prueba y todo se ve bien:
Nota: hice de la position una constante porque no puedo extraer las coordenadas de un documento como lo ha hecho usted. Pero funcionará siempre que tenga los valores correctos para position.coords.latitude y ...longitude
const position = { coords: { latitude: 21.0335386, longitude: -89.559187, } } function showPosition(position) { console.log("Latitude: " + position.coords.latitude) console.log("Longitude: " + position.coords.longitude); var navlat = position.coords.latitude; //Browser lat var navlon = position.coords.longitude; // Browser lon // Array var sucursales = [ {lat: 21.924089, lon: -102.293378, url: "https://shorturl.at/test1"}, {lat: 21.859964, lon: -102.298034, url: "https://shorturl.at/test2"}, {lat: 32.45569, lon: -116.836181, url: "https://shorturl.at/test3"}, {lat: 24.114868, lon: -110.340389, url: "https://shorturl.at/test4"}, {lat: 21.0335386, lon: -89.559187, url: "https://shorturl.at/test5"}]; //Match result const matchgeosucursal = sucursales.filter( sucursales => sucursales.lat === navlat && sucursales.lon === navlon); console.log("Match:") console.table( matchgeosucursal); } showPosition(position)Es probable que esté obteniendo un resultado indefinido porque su filtro está buscando una coincidencia exacta para la latitud y la longitud, y la ubicación geográfica del usuario no es lo suficientemente precisa como para identificar la latitud y la longitud exactas por las que está filtrando.
Para obtener una coincidencia, puede verificar si la latitud y la longitud del usuario están dentro de un rango, así:
const matchgeosucursal = sucursales.filter( sucursales => sucursales.lat >= (navlat -.005) && sucursales.lat <= (navlat +.005) && sucursales.lon >= (navlon -.005) && sucursales.lon <= (navlon +.005));Eso le daría precisión dentro de aproximadamente media milla. Obviamente, puede ajustar la amplitud de un rango que le gustaría usar, según sea necesario para su caso de uso.
//Request permissions $( document ).ready(function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else { console.log ("Geolocation is not supported by this browser."); } //Filter and gets match url function showPosition(position) { console.log("Latitude: " + position.coords.latitude) console.log("Longitude: " + position.coords.longitude); var navlat = position.coords.latitude; //Browser lat var navlon = position.coords.longitude; // Browser lon // Array var sucursales = [ {lat: 21.924089, lon: -102.293378, url: "https://shorturl.at/test1"}, {lat: 21.859964, lon: -102.298034, url: "https://shorturl.at/test2"}, {lat: 32.45569, lon: -116.836181, url: "https://shorturl.at/test3"}, {lat: 24.114868, lon: -110.340389, url: "https://shorturl.at/test4"}, {lat: 21.0335386, lon: -89.559187, url: "https://shorturl.at/test5"}]; //Match result const matchgeosucursal = sucursales.filter( sucursales => sucursales.lat >= (navlat -.005) && sucursales.lat <= (navlat +.005) && sucursales.lon >= (navlon -.005) && sucursales.lon <= (navlon +.005)); console.log('Match > \nlat: ' + matchgeosucursal[0].lat +"\nlon: " + matchgeosucursal[0].lon + "\nurl: " + matchgeosucursal[0].url); } }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>