2

GoogleマップV3マーカーを使用する場合は、各マーカーの名前を配列に保存してください。 。しかし、何らかの理由で、配列全体を繰り返し処理するはずの関数を呼び出すと、すべてのマーカーを長く取り除くと、マーカーの一部を削除しただけで関数は未定義に戻ります。関数の前

配列(markersArray):

["markerZip02111", "markerZip02139", "markerZip01002", "markerZip94602", "markerZip02460"] 

機能コード:

function removeAllMarkers(exceptId) { 
    $.each(markersArray, function(index, value) { 
     if(value != exceptId) { 
      eval(value+".setMap(null);"); 
      markersArray.splice(value, 1); 
      console.log(value); 
     } 
    }); 
} 

コンソールが表示何:

markerZip02111 
markerZip01002 
markerZip02460 
undefined 

が機能した後、アレイが実行されます:

["markerZip94602", "markerZip02460"] 

「未定義」の値に達するまで配列が正常に実行されていて、それが停止することは明らかです。この問題を回避するにはどうすればよいですか?

+3

。もしそれらがグローバルであれば、 'window [value]&window [value] .setMap(null);'を実行することができます。 –

+1

それを反復処理している間は配列をスプライスするのは賢明ではないようです。あなたは正確に何を達成しようとしていますか? – Domenic

+0

私はそうではありません:それらはグローバルであり、あなたはウィンドウ[値]によって何を意味するのかよくわかりません。 – Colin

答えて

3

開始時の配列に定義されていない値がない場合、反復処理中に未定義の値が得られているのは確かです。反復処理中に配列から項目を削除するということです。私はこれがjQuery $.each()イテレータを混乱させると思う。

あなたの出力を見れば、何が起こっていることはこれです:アイテムの2が評価やったことがなかったことを

1st Iteration 
    index === 0, array is["markerZip02111", "markerZip02139", "markerZip01002", 
          "markerZip94602", "markerZip02460"] 
    item 0 "markerZip02111" gets removed, shifting all the later elements up 
2nd Iteration 
    index === 1, but now array is ["markerZip02139", "markerZip01002", 
            "markerZip94602", "markerZip02460"] 
    item 1 "markerZip01002" gets removed, shifting all the later elements up 
3rd Iteration 
    index ===2, but now array is ["markerZip01002", "markerZip94602", 
            "markerZip02460"] 
    so the last item "markerZip02460" gets removed 
4th Iteration 
    index === 3, but now array only has two elements so value 
    at that index is undefined. 

はご注意:あなたがアイテムを削除することによって、そのインデックスを変更したため、イテレータはそれらの上にスキップ。

アイテムを削除する必要がある場合は、アイテムを削除してもループカウンタが壊れないように、ループを繰り返し実行する従来のforループでは簡単です。 (または、アイテムを削除するたびにカウンタ変数を調整する限り、従来のforループを使用することもできます)

また、スプライスするときは、アイテムのインデックスを最初のものとして渡す必要がありますパラメータであり、アイテムの値ではありません。従ってmarkersArray.splice(index, 1);は、markersArray.splice(value, 1);ではありません。

だから、のようなもの:あなたの代わりにそれらの変数作るの対象に各 `markerZipxxxxx`項目を設定した場合は、簡単`)( `evalのを避けることができ

function removeAllMarkers(exceptId) { 
    var value; 
    for (var i = markersArray.length - 1; i >= 0; i--) { 
     value = markersArray[i]; 
     if (value != exceptId) { 
     markersArray.splice(i, 1); 
     eval(value+".setMap(null);"); 
     console.log(value + " removed"); 
     } 
    } 
} 
+0

ありがとう!これは非常によく書かれた説明です。私は何が間違っていたかを完全に理解しています!ありがとうございました!私は今、マーカーを削除していないGoogle Mapsに問題がありますが、ループの停止とは関係ありません。 – Colin

1
$.each(markersArray, function (index, value) {    
      if (value != null && value != undefined && value!= exceptId) { 
       eval(value + ".setMap(null);"); 
       markersArray.splice(value, 1); 
       console.log(value); 
      } 
     }); 
+0

!= undefinedという値を追加すると、ループは未定義の値になると停止します。 – Colin

+0

更新しました。 – dotnetstep

2

私はdotnetstepがそれを釘付けと思いますが、あなたはまた、より広範な取扱いのためのtry/catchで$.each内部のロジックをラップ試すことができます。

http://www.w3schools.com/js/js_try_catch.asp

幸運!

+0

問題は、キャッチにエラーが渡されていないことです。問題は、 "undefined"が渡されたときにループが停止することです。 – Colin

+0

@ Colin- try/catchループは、エラーが発生したときにプログラムが停止するのを防ぎます(特に "catch"部分で停止するよう指示しない限り)。 ;) –

関連する問題