2011-05-23 131 views
1

我有問題在我的js代碼中設置一些值。我試圖找出問題所在,但仍然無法在代碼中找到問題。循環中的問題設置值

這是我想要設置的mostN,mostE,mostW,mostS值。

代碼末尾的提示「未定義」。爲什麼?我該如何解決它? Thx!

var mostN, 
mostE, 
mostW, 
mostS; 

for (i = 1; i < opts.markers.length; i += 1) //loops 5 times 
{ 
$geocoder.geocode(
{ 
    address: opts.markers[i].address}, 
    function (result, status) 
    { 
     if (status === google.maps.GeocoderStatus.OK) 
     { 
      var str = [result[0].geometry.location]; // "(42.456465, -48.74116)" 
      var realString = str.toString(); 
      var stop = realString.length - 1; 
      var real = realString.substring(1,stop); // "42.456465, -48.74116" 

      var arr = real.split(", "); 

      var lat = arr[0].toString(); // "42.456465" 
      var lng = arr[1].toString(); // "-48.74116" 

      if(mostN > lat) { mostN = lat; } 
      if(mostE < lng) { mostE = lng; } 
      if(mostW > lng) { mostW = lng; } 
      if(mostS < lat) { mostS = lat; } 

      alert(mostN); // returns "Undefined" 
     } 
     else 
     { 
      if (opts.log) {console.log("Geocode was not successful for the following reason: " + status); } 
     } 
    } 
); 

}

+0

你有沒有把mostN設置爲任何東西?從這段代碼中你並不清楚,這將解釋爲什麼它是未定義的。 – Jeff 2011-05-23 06:34:06

+1

@Awais很好,不僅在php變量中可以有名字'$ geocoder'。 – 2011-05-23 06:36:38

回答

1

你似乎沒有考慮經緯度的標誌。例如,

> var mostN, 
> ... 
> var lat = arr[0].toString(); // "42.456465" 

從您的文章中,拉特已經是一個字符串,所以將其轉換爲字符串似乎毫無意義。考慮到以後的算術執行比較,倒不如將其轉換爲數字的前面:

var lat = Number(arr[0]); // 42.456465 

var lat = +(arr[0]); // 42.456465 

> ... 
>  if(mostN > lat) { mostN = lat; } 
>  if(mostE < lng) { mostE = lng; } 
>  if(mostW > lng) { mostW = lng; } 
>  if(mostS < lat) { mostS = lat; } 

可變mostN還沒有被初始化,以便在比較它相當於零,這是比42.456465更大,所以測試返回false和mostN未設置。但是,將設置mostS

但相比較而言的符號是錯誤的 - 如果緯度是一個更大的+已經數更偏北如此:

if (mostN < lat) { mostN = lat; } 

是你想要的,同爲測試的其餘部分。不過,你還必須考慮到半球,其中-10比-20更偏北,因此(提供mostN和LAT是數字,而不是字符串):

if ((mostN + 90) < (lat + 90)) { mostN = lat; } 

由於緯度從未大於90度。對於經度,使用180.你可以使用任何你喜歡的數字,對於緯度經度爲90或更大,長度可以爲180或更大,所以你可以使用180,但這可能會讓維護人員感到困惑。

+0

非常感謝!真是偉大的投入! – Maartin 2011-05-23 09:13:54

0

作品,因爲它應該的,因爲在檢查變量的時刻mostN是不確定的,而且條件mostN > lat是假的。

+0

它可能「起作用」,因爲它產生了代碼定義的結果,但它在邏輯上是錯誤的,因爲這不僅是比較倒退,而且也不允許考慮半球。 – RobG 2011-05-23 07:40:01

1

試着這麼做:

var SOMETHING_HUGE = 100000000; 
var mostN = -SOMETHING_HUGE, 
mostE = -SOMETHING_HUGE, 
mostW = SOMETHING_HUGE, 
mostS = SOMETHING_HUGE; 

//... 

if(lat > mostN) { mostN = lat; } 
if(lng > mostE) { mostE = lng; } 
if(lng < mostW) { mostW = lng; } 
if(lat < mostS) { mostS = lat; } 
+0

我想你顛倒了一些操作數? – Jeff 2011-05-23 06:46:24

+0

@Jeff - 我想我已經修復了它... – sje397 2011-05-23 06:49:09

+0

應該是< >< > – Jeff 2011-05-23 06:53:40

0

你mostN與某些value.Try明確初始化放置警示裏面

if(mostN > lat) { mostN = lat; }

條件。並檢查比較結果是否正確。