2013-08-21 102 views
6

我在Javascript中遇到這個問題:我想從對象數組中獲取經度和緯度值。這一切都可以正常工作,但是當我嘗試將其保存到全局數組中時,它會覆蓋以前的每個值。結果是一個8倍於上次推送對象的數組。Javascript push Object到全局數組覆蓋以前的值?

全球陣列:var _coordinates = [];

function getCoordinates() 
{ 
    mark = {}; 

    for(var key in _data) 
    { 
     if(_data.hasOwnProperty(key)){ 
      mark["lng"] = _data[key].long; 
      mark["lat"] = _data[key].lat; 
     } 

     console.log(mark); // Returns different coordinates (yay) 
     _coordinates.push(mark); 

    } 

    console.log(_coordinates); // All coordinates are the same (meh) 
} 

這是我第一次問一個問題在這裏。所以如果我忘記了什麼,請說出來。

+0

你想在這裏的全局和局部變量?目前,'mark'是全局的,'_coordinates'被假定爲+ global,'_data'被假定爲+ global。 –

+0

所以問題是你正在研究'mark'的相同實例 –

回答

4

你可以嘗試聲明和實例mark對象for循環中,因爲現在正在修改的同一實例的所有時間:

function getCoordinates() { 
    for(var key in _data) { 
     var mark = {}; 
     if(_data.hasOwnProperty(key)) { 
      mark["lng"] = _data[key].long; 
      mark["lat"] = _data[key].lat; 
     } 
     _coordinates.push(mark); 
    } 

    console.log(_coordinates); 
} 
+0

@OttoAllmendinger,你確定嗎?你測試過了嗎?因爲這似乎工作得很好:http://jsfiddle.net/bGGPX/爲什麼這個演示如果你是對的工作? –

+1

@OttoAllmendinger'var'聲明的確被提了出來,但是因爲'mark'每個循環仍然被重新分配給一個新的對象,這仍然有效。 –

+0

哎呀,你是對的。經常被它咬了,現在我太偏執了;-) –

2

的問題是,你反覆修改同一個對象。你的數組最終包含八個對這個對象的引用。

要修復,移動

mark = {}; 

for循環。

1

您正在突變每個循環中的(全局)變量mark。這樣做,而不是

_coordinates.push({lng: _data[key].long, lat: data[key].lat});