如何提取数组中每个对象的Lat和Long属性用于坐标距离计算
解决方案
原代码存在的问题
- 变量名大小写不匹配:
funTest中定义的是Lat(大写),调用compare时写成了小写的lat,同理Lon和lon,会导致未定义错误 compare函数参数传递缺失:调用时只传了两个参数,但函数需要四个,客户坐标GUESTLAT、GUESTLON没有传入compare函数内的语法错误:newLong = GUESTLON = lon是赋值操作,不是差值计算,应该是GUESTLON - lon- 缺少距离计算的实际逻辑,仅做了坐标差值,未完成距离计算
修正后的代码
const places = [ { City: 'Tribuckan', Lat: 48569.52, Long: 48.5 }, { City: 'Mecca', Lat: 48569.52, Long: 48.5 }, { City: 'Dazenda', Lat: 48569.52, Long: 48.5 }, { City: 'Uzumakin', Lat: 48569.52, Long: 48.5 }, ]; // 计算两点距离(假设是平面坐标,用欧几里得距离;如果是经纬度需用Haversine公式) const calculateDistance = (placeLat, placeLon, guestLat, guestLon) => { // 欧几里得距离计算 const latDiff = guestLat - placeLat; const lonDiff = guestLon - placeLon; return Math.sqrt(latDiff ** 2 + lonDiff ** 2); }; // 遍历所有地点,计算每个地点与客户坐标的距离 const processPlaces = (places, guestLat, guestLon) => { places.forEach(place => { const distance = calculateDistance(place.Lat, place.Long, guestLat, guestLon); // 可按需处理结果,比如打印或存储 console.log(`${place.City} 与客户坐标的距离: ${distance.toFixed(2)}`); }); }; // 示例:客户输入的坐标 const GUEST_LAT = 48570.0; const GUEST_LON = 49.0; // 执行处理 processPlaces(places, GUEST_LAT, GUEST_LON);
代码说明
- 统一变量命名,避免大小写错误
- 将客户坐标作为参数传入
processPlaces,确保每个地点都能拿到对比基准 - 实现了基础的平面距离计算逻辑,如果是经纬度坐标,可替换为以下Haversine公式:
经纬度距离计算(Haversine公式)
const calculateDistance = (placeLat, placeLon, guestLat, guestLon) => { // 转换为弧度 const radPlaceLat = Math.PI * placeLat / 180; const radGuestLat = Math.PI * guestLat / 180; const radLatDiff = Math.PI * (guestLat - placeLat) / 180; const radLonDiff = Math.PI * (guestLon - placeLon) / 180; // Haversine公式 const a = Math.sin(radLatDiff / 2) ** 2 + Math.cos(radPlaceLat) * Math.cos(radGuestLat) * Math.sin(radLonDiff / 2) ** 2; const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); // 地球半径(单位:公里,可按需调整为米等) const earthRadius = 6371; return earthRadius * c; };
内容的提问来源于stack exchange,提问作者Rachel Nurmi
相关产品推荐
相关产品推荐

