2013-08-21 14 views
6

Sto riscontrando questo problema in Javascript: voglio ottenere i valori di longitudine e latitudine da una matrice di oggetti. Funziona tutto bene, ma quando provo a salvarlo in un array globale, sovrascrive ogni valore precedente. Il risultato è un array con 8 volte l'ultimo oggetto spinto.L'oggetto push di Javascript sull'array globale sovrascrive i valori precedenti?

gamma globale: 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) 
} 

Questa è la mia prima volta facendo una domanda qui. Quindi se ho dimenticato qualcosa, per favore dillo.

+0

Cosa vuoi che siano le variabili globali e locali, qui? al momento, 'mark' è globale,' _coordinates' è assunto + globale, '_data' è assunto + globale. –

+0

quindi il problema è che stai lavorando sulla stessa istanza di 'mark' –

risposta

4

Si potrebbe provare a dichiarare e un'istanza dell'oggetto mark all'interno del ciclo for perché in questo momento si sta modificando la stessa istanza per tutto il tempo:

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, sei sicuro? L'hai provato? Perché sembra funzionare perfettamente bene: http://jsfiddle.net/bGGPX/ Perché questa demo funzionerebbe se tu avessi ragione? –

+1

@OttoAllmendinger La dichiarazione 'var' è effettivamente issata, ma poiché' mark' viene ancora riassegnata a un nuovo oggetto ogni ciclo, funziona ancora. –

+0

Whoops, hai ragione. Sono stato morso spesso da esso, ora sono troppo paranoico ;-) –

2

Il problema è che si sta più volte modificando lo stesso oggetto. Il tuo array finisce con otto riferimenti a quell'unico oggetto.

per riparare, spostare

mark = {}; 

nel circuito for.

1

Si sta modificando la variabile (globale) mark in ogni ciclo. Lo fai invece

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