2012-05-30 100 views
2

我有被格式化這樣的對象:Javascript:對象被推入陣列覆蓋對方?

var telemetry_data = { 

    T36: [ 
    //Date, lat, long 
    [20120516, 25.40294163, -80.46972051], 
    [20120518, 25.40306787, -80.46967025], 
    [20120521, 25.40234592, -80.46980265] 
    ], 

    T43: [ 
    [20120523, -25.4076545, -80.46945134], 
    [20120525, -25.40761155, -80.46756243] 
    ] 
}; 

這表明不同動物(T ##)在不同的日期的位置。我想在Google地圖上放置一個標記,顯示某個特定日期的動物位置,以及一條多段線顯示其到達目的地的路徑。我在折線部分遇到問題。請看下面。一切似乎一直工作到path[tegu_name[j]].push(tegu_location);,其中path[tegu_name[j]]看起來像它只被最後一個位置覆蓋,而不是被添加到陣列的位置。對於某些動物(T23,T34,T35,T36),儘管存在正確日期的位置,但陣列仍保持完全空。有任何想法嗎?我有一種感覺,我犯了一些愚蠢的錯誤,但我無法弄清楚。

Live:http://crocdoc.ifas.ufl.edu/projects/tegumap/(將日期更改爲5月18日,以便通過多個位置運行這部分代碼,並且可以從[776行]中僅看到一個位置的控制檯打印對象,當前位置爲紫色點)

完全JS:http://crocdoc.ifas.ufl.edu/projects/tegumap/js/tegumap.js

//Telemetered tegus 
var tegu_location; 
var path = new Object(); 
var line = new Object(); 

//For each tegu 
for (var j = 0; j < tegu_name.length; j++) { 
    var tegu_key = telemetry_data[tegu_name[j]]; 
    //For each date 
    for (var k = 0; k < tegu_key.length; k++) { 
     path[tegu_name[j]] = new Array(); 
     if (tegu_key[k][0] <= date) { 
      console.log("use point at date "+tegu_key[k][0]); 
      tegu_location = new google.maps.LatLng(tegu_key[k][1], tegu_key[k][2]); 
      path[tegu_name[j]].push(tegu_location); 
     } else { 
      marker = new google.maps.Marker({ 
       icon: point_tracked, 
       shape: point_shape, 
       map: map, 
       position: tegu_location 

      }); 
      marker_container.push(marker); 

     } 
     console.log(path[tegu_name[j]]); 
    } 

    line[tegu_name[j]] = new google.maps.Polyline({ 
     path: path[tegu_name[j]], 
     strokeColor: '#32cd32', 
     strokeOpacity: 0.6, 
     strokeWeight: 3 
    }); 
    line[tegu_name[j]].setMap(map); 


} 

回答

4

它看起來像你的path[tegu_name[j]] = ...線(755)應該是k循環,否則將陣列重新建立對k每次迭代。

+0

我很少感覺如此幸福的感覺如此愚蠢。我肯定是在錯誤的地方尋找我的問題。我最大的感謝!現在一切似乎都正常。 – petroica

+1

今天我也有這樣的感覺。很高興它爲你工作。 – Steve

1

不,.push()方法沒有被覆蓋。這是每次覆蓋陣列的path[tegu_name[j]] = new Array();

然而,還有一些其他的更正/簡化。

  • marker_container是一個數組。這裏不要使用for-in-loop(changeDate函數的開頭)
  • telemetry_data是一個帶有屬性的對象。您應該在這裏使用for-in-loop,而不是創建一個屬性名稱數組(tegu_name)並對其進行迭代。

var tegu_location; 
var path = new Object(); 
var line = new Object(); 

//For each tegu 
for (var tegu in telemetry_data) { 
    path[tegu] = new Array(); 
    //For each date 
    for (var k = 0; k < telemetry_data[tegu].length; k++) { 
     var keys = telemetry_data[tegu][k]; 
     if (keys[0] <= date) { 
      console.log("use "+ tegu +" point ("+keys[1]+", "+keys[2]+") at date "+keys[0]); 
      path[tegu].push(tegu_location = new google.maps.LatLng(keys[1], keys[2])); 
     } else { 
      if (tegu_location) { 
       marker = new google.maps.Marker({ 
        icon: point_tracked, 
        shape: point_shape, 
        map: map, 
        position: tegu_location 
       }); 
       marker_container.push(marker); 
      } 
     } 
    } 
    console.log(path[tegu]); 

    line[tegu] = new google.maps.Polyline({ 
     path: path[tegu], 
     strokeColor: '#32cd32', 
     strokeOpacity: 0.6, 
     strokeWeight: 3 
    }); 
    line[tegu].setMap(map); 
} 
+0

啊!在我寫這些代碼時,我發現自己想知道「for x in y」與「for i petroica