2013-08-21 44 views
6

Tôi gặp vấn đề này trong Javascript: Tôi muốn nhận được các giá trị kinh độ và vĩ độ từ một mảng các đối tượng. Điều này tất cả hoạt động tốt, nhưng khi tôi cố gắng lưu nó vào một mảng toàn cầu, nó sẽ ghi đè mọi giá trị trước đó. Kết quả là một mảng với 8 lần đối tượng được đẩy cuối cùng.Đẩy Javascript Đối tượng vào mảng toàn cục sẽ ghi đè các giá trị trước đó?

mảng toàn cầu: 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) 
} 

Đây là lần đầu tiên tôi hỏi một câu hỏi ở đây. Vì vậy, nếu tôi quên một cái gì đó, xin vui lòng nói như vậy.

+0

Bạn muốn biến toàn cầu và cục bộ ở đây là gì? hiện tại, 'mark' là global,' _coordinates' được giả định + global, '_data' được giả định + global. –

+0

vì vậy vấn đề là bạn đang làm việc trên cùng một ví dụ của 'mark' –

Trả lời

4

Bạn có thể thử để khai báo và khởi tạo đối tượng mark bên trong for loop vì ngay bây giờ bạn đang thay đổi cùng một ví dụ tất cả các thời gian:

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, bạn có chắc chắn không? Bạn đã thử nó chưa? Bởi vì điều này dường như làm việc hoàn toàn tốt đẹp: http://jsfiddle.net/bGGPX/ Tại sao demo này sẽ hoạt động nếu bạn đã đúng? –

+1

@OttoAllmendinger Khai báo 'var' thực sự là hoisted, nhưng vì' mark' vẫn được gán lại cho một đối tượng mới mỗi vòng lặp, điều này vẫn hoạt động. –

+0

Rất tiếc, bạn đã đúng. Bị cắn thường xuyên bởi nó, bây giờ tôi quá hoang tưởng ;-) –

2

Vấn đề là bạn đang liên tục thay đổi cùng một đối tượng. Mảng của bạn kết thúc với tám tham chiếu đến một đối tượng đó.

Để khắc phục, di chuyển

mark = {}; 

vào for vòng lặp.

1

Bạn đang biến đổi biến (toàn cầu) mark trong mỗi vòng lặp. Thực hiện việc này thay vì

_coordinates.push({lng: _data[key].long, lat: data[key].lat}); 
Các vấn đề liên quan