2009-04-03 3 views
-1

В приложении Google Maps я могу разместить маркеры на карте и сохранить ссылку на каждый размещенный маркер вместе с дополнительной информацией в массиве с именем markers.Удалить произвольный элемент из массива JavaScript

Добавление маркеров легко, я просто push() вновь созданный объект на массив (markers.push(marker));

Однако, когда дело доходит до удаления произвольного маркера из массива, учитывая индекс слота, он не ведет себя так, как ожидалось. Моя функция:

function deleteMarker(markerIndex) { 
    if (markerIndex!='' && markerIndex>=0 && markerIndex<markers.length) { 
     if (confirm('Do you really want to remove this marker from the map?')) { 
      alert('deleting marker '+markerIndex); //debugging purposes 
      markers.splice (markerIndex, 1); 
     } 
    } 
} 

У меня нет опыта работы с функцией сплайсинга(), но, глядя на its description @ w3schools это, кажется, довольно прямо вперед. Однако, я получаю следующее поведение:

markers.splice() ничего не делает. Так что я делаю неправильно?

А также, когда markerIndex - 0, не отображается окно подтверждения. Сначала я предположил, что длительное if-условие оценивается как false, и поэтому весь блок кода был пропущен, однако, используя Firebug, чтобы выполнить вызовы, которые я обнаружил, что условие выполняется (конечно) для индекса 0, когда массив непусто , следующий шаг показывает, что if (confirm(...)) и alert('deleting...) являются пропущен и markers.splice() называется (но ничего не происходит). Такое поведение так странно, что я решил открыть этот вопрос.

Может кто-нибудь объяснить, что происходит?

Я думал, что удаление маркеров будет самым простым набором функций, которые можно было бы сделать. Я могу добавить их, отредактировать их содержимое, даже очистить все маркеры (pop() -отметить маркеры от массива markers до пустого), и все работает красиво.

ответ

2

Одна из проблем с кодом заключается в том, что JavaScript интерпретирует 0 == '' как истинный, поэтому для markerIndex нулевого кода подтверждения не выполняется. Я думаю, что вы неправильно шаги Firebug показывает, или что он просто глючит здесь, так как ваше, если условие будет на самом деле оценить ложь для markerIndex 0.

Вы можете использовать тип-строгого сравнения путем добавления дополнительного =:

if (markerIndex !== '' && ...) { 

Более легкий подход будет:

if (markers[markerIndex] !== undefined) { 

Поскольку JavaScript не вызывает ошибку при доступе к неопределенным членам объекта.

Ваша другая проблема с splice() не работает, это странно (должно работать).

+0

Большое спасибо за помощь. Это должно позаботиться об 0-индексной проблеме :) Я продолжаю пробовать функцию splice(). Кажется, нужно работать, но результаты странные ... Я думаю, что я на правильном пути и сам это выясню. Был просто озадачен тем, что показал Firebug ... Нельзя доверять ему слишком много :) –

+0

В ответ на: «Ваша другая проблема с splice() не работает, это странно (она должна работать)». Да ты прав. Он делает: $ –

-1

не уверен, что это то, что здесь происходит. но я видел, что один и тот же код работает по-разному в firebug, когда он отлаживается v, когда он не отлаживается. Я уверен, что у меня не было часов, которые мешали бы и коду.

+0

Вы правы. Firebug - один из самых полезных маленьких плагинов, но также время от времени является источником большого раздражения. Похоже, что странное поведение Firebug мало чем связано с моим кодом. –

0
function deleteMarker(markerIndex) { 
    if (markers[markerIndex] !== undefined) { 
     if (confirm('Do you really want to remove this marker from the map?')) { 
      map.removeOverlay(markers[markerIndex]); 
      markers.splice (markerIndex, 1); 
     } 
    } 
} 

Это похоже на заботу обо всех проблемах. Спасибо за ваши ответы, очень благодарен. мне особенно нравится идея сокращения первого if-условие просто:

if (markers[markerIndex] !== undefined)

splice(), кажется, работают непосредственно на решетке (вопреки тому, что намекал NuclearDog) и он работает, как ожидалось. Мой дорогой Firebug вводит меня в заблуждение.

Смежные вопросы