You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中高效存储坐标信息的方法

问题描述

我需要在JavaScript代码中存储一些坐标,起初只有10到20个,但现在已有约50个,代码开始变得十分混乱。目前我采用两个数组分别存储纬度和经度,相关代码如下:

function mia_posizione(position) {
    
    let latitudini = [45.830527, 45.879442, 46.017065, 46.045482, 46.025059, 45.980489, 46.029090, 46.084223, 45.836633, 45.837948, 45.837878, 45.834405, 45.836208, 45.832634, 46.481307];
    let longitudini = [9.029344, 8.979577, 8.931969, 8.978964, 8.965355, 8.926994, 8.969981, 9.036319, 9.032914, 9.026279, 9.023992, 9.035057, 9.034544, 9.021575, 9.916223];
    for(let i=0; i<latitudini.length; i++){
        var latLocation =  latitudini[i];
        var lonLocation = longitudini[i];
        var latUser = position.coords.latitude;
        var lonUser = position.coords.longitude;
        var R = 6371;
        var dLat = deg2rad(latLocation - latUser);
        var dLon = deg2rad(lonLocation - lonUser);
        var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(deg2rad(latUser)) * Math.cos(deg2rad(latLocation)) * Math.sin(dLon/2) * Math.sin(dLon/2); 
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
        var y = R * c;
        var Approssimazione = aprox(y)
        document.getElementById(i).setAttribute("data-index", y);
        const Raggio = document.getElementById(i);
        if(Raggio.dataset.index>1000){
            document.getElementById(i).style.display="none"; 
        }
    }
}

上述坐标仅为其中一部分,请问是否有更便捷的方式来存储和访问这些坐标?


解决方案

1. 用对象数组整合坐标数据

把纬度和经度配对成独立对象,放在同一个数组中,这样每个坐标的纬度、经度不会分离,可读性和维护性大幅提升:

// 整合后的坐标数组,每个元素包含对应的经纬度
const locations = [
  { lat: 45.830527, lon: 9.029344 },
  { lat: 45.879442, lon: 8.979577 },
  { lat: 46.017065, lon: 8.931969 },
  // ... 其他坐标依次添加
];

function mia_posizione(position) {
  // 把循环内不变的变量提到外部,避免重复声明
  const latUser = position.coords.latitude;
  const lonUser = position.coords.longitude;
  const R = 6371;

  locations.forEach((location, index) => {
    const { lat: latLocation, lon: lonLocation } = location;
    const dLat = deg2rad(latLocation - latUser);
    const dLon = deg2rad(lonLocation - lonUser);
    const a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(deg2rad(latUser)) * Math.cos(deg2rad(latLocation)) * Math.sin(dLon/2) * Math.sin(dLon/2); 
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    const distance = R * c;
    
    // 只获取一次DOM元素,避免重复查询
    const targetElement = document.getElementById(index);
    targetElement.setAttribute("data-index", distance);
    if(distance > 1000){
      targetElement.style.display = "none"; 
    }
  });
}

2. 抽离数据到单独文件(适合大量坐标)

如果坐标数量还会持续增加,可以把坐标数据单独放在JSON文件中,比如locations.json:

[
  {"lat": 45.830527, "lon": 9.029344},
  {"lat": 45.879442, "lon": 8.979577},
  // ... 其他坐标
]

然后通过fetch加载数据,让代码和数据彻底分离:

async function mia_posizione(position) {
  const response = await fetch('./locations.json');
  const locations = await response.json();
  
  const latUser = position.coords.latitude;
  const lonUser = position.coords.longitude;
  const R = 6371;

  locations.forEach((location, index) => {
    // 后续逻辑和之前一致
    const { lat: latLocation, lon: lonLocation } = location;
    const dLat = deg2rad(latLocation - latUser);
    const dLon = deg2rad(lonLocation - lonUser);
    const a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(deg2rad(latUser)) * Math.cos(deg2rad(latLocation)) * Math.sin(dLon/2) * Math.sin(dLon/2); 
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    const distance = R * c;
    
    const targetElement = document.getElementById(index);
    targetElement.setAttribute("data-index", distance);
    if(distance > 1000){
      targetElement.style.display = "none"; 
    }
  });
}

3. 额外优化细节

  • 给变量起更清晰的名字,比如把y改为distance,一眼就能看出代表距离;
  • 用forEach替代传统for循环,代码更简洁易读;
  • 避免重复调用document.getElementById(index),减少DOM查询开销。

内容的提问来源于stack exchange,提问作者Adry_1909

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:27:05