0

我正在解析 CSV 文件并将线条转换为地图上的标记,侧边栏上有相应的按钮。

我目前创建标记的方法是

var bounds = new google.maps.LatLngBounds();
var sensor, i, latlng;
for (i in sensorList) {
    // Creates a marker
    sensor = sensorList[i];
    latlng = new google.maps.LatLng(sensor.lat, sensor.lng);
    bounds.extend(latlng);
    var marker = createMarker(
        latlng, sensor.name, sensor.reading
    );  

    // Creates a sidebar for the marker
    createMarkerButton(marker);
}

// Fit to map bounds
mapCanvas.fitBounds(bounds);

我的 createMarker 函数是

function createMarker(latlng, title, html) {
    // Creates a marker
    var marker = new google.maps.Marker({
        position: latlng,
        map: mapCanvas,
        title: title
});
// The InfoWindow is opened when the sidebar button is clicked
        google.maps.event.addListener(marker, "click", function() {
            infoWnd.setContent("<div class = \"PopUp\" style=\"width: 150px; height: 100px;\"<strong>"+title+"</title></strong><br>Latest reading: "+html+"<br><a href=\"\">Full reading</a>");
            infoWnd.open(mapCanvas, marker);
        });
        return marker;
    }

这适用于每个传感器名称/位置都是唯一的 CSV 文件。我正在尝试扩展它以支持在 CSV 文件中存储多个条目的同一个传感器,并且仅为每个传感器的最新条目创建一个标记/按钮。

我相信这样做的推荐方法是保留一组标记,每次创建标记时,我都应该与这个数组进行比较。我对 Javascript 和 Google-Maps 很陌生,不确定应该在哪里进行检查。我玩弄了几种可能性,但似乎都没有。

有什么建议吗?

4

1 回答 1

1

建议的第一句话,因为我不完全清楚您的 sensorList 是对象还是数组(我怀疑它是数组?因为我不明白为什么它会在这里成为对象),所以不要使用数组上的“for in”构造,也不在 javascript 中创建关联数组。只为对象保存“for in”构造,并在数组上使用“for”或“while”或“do while”。我这么说有两个原因,一个是“for in”循环实际上是可用循环类型中最慢的,其次是变量类型的可读性明显(你看到一个“for”或“while”或“do while "循环,你应该能够知道你正在处理一个数组,同样你看到一个“for in”循环你应该能够知道你'

通常清除具有相同属性名称的多个条目的好方法是使用一个对象来存储“传感器”对象名称的值,然后检查该对象是否存在同名。例如,假设您有一个对象数组:

var sensorList = [ //an array of objects
    {name: 'sensorA', propA: 1, propB: 2},
    {name: 'sensorB', propA: 3, propB: 4},
    {name: 'sensorC', propA: 5, propB: 6},
    {name: 'sensorB', propA: 7, propB: 8},
    {name: 'sensorA', propA: 9, propB: 10},
    {name: 'sensorD', propA: 11, propB: 12}
];

然后创建一个可用于过滤现有名称的对象:

var sensorsObj = {};

现在遍历 sensorList 并按名称检查每个传感器是否存在于 sensorsObj 中:

for (var sensor, i = 0, len = sensorList.length; i < len; i++) {
    sensor = sensorList[i];
    if (!sensorsObj[sensor.name]) {
        sensorsObj[sensor.name] = 1;
        //we know we have not ran across this name yet, so here we can
        //create LatLng's, extend bounds, create markers, yada yada yada
    }
}

现在,不确定您的传感器列表中的事物顺序是什么,从最旧到最新或从最新到最旧。如果从最旧到最新,您可能想要这样做:sensorList = sensorList.reverse(); 在“for”循环之前反转数组的顺序。实际上,既然我这么说,实际上从数组末尾开始循环会更好(更快):

for (var sensor, i = sensorList.length - 1; i >= 0; i--) {
于 2013-10-24T09:34:40.987 回答