Попытка использовать $ .each jquery итератор. В чем разница между этими двумя? - PullRequest
0 голосов
/ 02 октября 2011

vertices - это массив объектов google.maps.LatLng, поэтому они должны возвращать точки возврата.Это отлично работает для первого фрагмента кода.У меня возникают проблемы при использовании второго.

// Iterate over the vertices.
for (var index =0; index < vertices.length; index++) {
  var value = vertices.getAt(index);
  contentString += "<br />" + "Coordinate: " + index + "<br />" + value.lat() +"," + value.lng();
      }

Мне кажется, что этот код должен означать одно и то же, но когда я использую каждый итератор, я получаю сообщение об ошибке JavaScript: Uncaught TypeError: Cannotвызов метода 'lat' из неопределенного

  $.each(vertices, function(index, value){
    contentString += "<br />" + "Coordinate: " + index + "<br />" + value.lat() +"," + value.lng();
  });

Ответы [ 4 ]

4 голосов
/ 02 октября 2011

Выдает ошибку, поскольку вершины не являются обычным массивом javascript (в объекте Array в Javascript нет метода getAt). Согласно документам Google:

Полилиния задает серию координат в виде массива объектов LatLng. Чтобы получить эти координаты, вызовите метод PolyPath (), который вернет массив типа MVCArray. Примечание: вы не можете просто получить i-й элемент массива, используя синтаксис mvcArray [i]; Вы должны использовать mvcArray.getAt (i).

Таким образом, вы должны иметь:

$.each(vertices, function(i) { var value = vertices.getAt(i); ... });
3 голосов
/ 02 октября 2011

Если вы итерируете по обычному массиву, они будут функционально очень похожи, и ваша вторая версия будет работать.Но похоже, что вы перебираете MVCArray , вероятно из polyline.getPath, а это , а не массив.вызовите .getArray(), чтобы получить базовый массив вершин:

$.each(vertices.getArray(), function(index, value){
    contentString += "<br />" + "Coordinate: " + index + "<br />" + value.lat() +"," + value.lng();
});
1 голос
/ 02 октября 2011

Последний запускает функцию, которая также предоставляет вам новую область видимости.

Возможно, вы этого не знаете, но var value, объявленный вами для for, фактически объявлен в той же области действия, что и для себя (этоparent) ..

JavaScript не имеет области действия блока , а имеет только область действия функции.Таким образом, любая переменная, которая не объявлена ​​в начале функции, фактически объявляется для всей функции, даже если она вложена в цикл if или.

Кроме того, вы не получаете абстракцию браузера, предоставляемую jQuery.jQuery определит, в каком браузере вы работаете, и может выбрать более эффективный путь для выполнения вашего foreach, в то время как другой всегда будет использовать Array.getAt - даже если может быть лучший способ сделать это (например, браузер начинает предоставлять нативныйнапример, функция - всегда предполагая, что вы обновляете jQuery)

Вкратце: ребята из jQuery знают гораздо больше о браузерах и их особенностях, чем вы, и их способ предоставляет вам бесплатную область видимости цикла.Написание собственного текста более подвержено ошибкам и может оказаться менее эффективным.

0 голосов
/ 02 октября 2011

Сначала нужно убедиться, что возвращает Google API.означает, что при использовании этой

$.each(vertices, function(index, value){
    for(var i in value){
           alert('key =>'+i+' value=>'+value[i]);
    }
  });

Это даст вам правильное понимание того, что возвращает API Google, и сможете ли вы вызывать функции .lng () и .lat ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...