Я думаю, вы должны перефразировать вопрос, чтобы быть более ясным.Из вашего примера видно, что несколько элементов могут быть удалены из массива image.pinpoints
, если свойство position
совпадает со свойством pinpoint
.Поэтому он будет удалять каждый image.pinpoints[i].position == pinpoint.position
, где i
переходит от 0
до (image.pinpoints.length - 1)
.
Поскольку вы также выполняете итерацию по массиву одновременно, я бы не рекомендовал использовать splice
само собой.Вместо этого delete
сначала каждый индекс, а затем очистка массива во втором проходе.
splice
и delete
будут работать по-разному, так как delete создает отверстие в массиве и устанавливает значение удаленного свойства равным undefined
.С другой стороны, splice
удалит элемент, как если бы он никогда не существовал, и исправит индексы всех элементов после того, как он будет смежным.Рассмотрим этот пример:
> var a = [2,3,5,7,11]; // create an array of 5 elements
> undefined
> a[2] // see the value of the third element
> 5
> delete a[2] // delete the third element using "delete"
> true
> a // log contents of a
> [2, 3, undefined, 7, 11]
> a[2] // index 2 still exists with value "undefined" now
> undefined
splice
здесь само по себе также проблематично, так как если вы удаляете элемент, все индексы после этого элемента сместятся на один вверх, и вы пропустите проверку следующего элемента.Рассмотрим второй пример:
> var a = [2,3,5,7,11]; // create array of 5 elements
> for(var i = 0; i < a.length; i++) {
if(a[i] == 3 || a[i] == 5) { // if it's 3 or 5, take it out
a.splice(i, 1);
}
}
> a
[2, 5, 7, 11]; // yikes, 5 still exists
В приведенном выше примере 5
все еще присутствует, поскольку мы никогда не проверяли это значение.Когда мы увидели 3
, текущий индекс был 1
.После объединения массива следующий элемент - 5
поднялся, чтобы занять свое место, и стал индексом 1
.Поскольку на этом этапе мы уже закончили с индексом 1
, мы просто перейдем к следующему индексу - 2
, который теперь имеет значение 7
, и пропустим 5
.В целом, не рекомендуется использовать итерации с помощью индексов и выполнять удаление на месте.
В качестве решения я бы создал новый массив и вставил только те свойства, которые в нем нельзя удалять.
$.fn.mapImage.deletePinpoint = function(image, pinpoint) {
// will hold all objects that are not to be deleted
var remainingPinpoints = [];
for (var i = 0; i < image.pinpoints.length; i++) {
// reverse condition
if(image.pinpoints[i].position != pinpoint.position) {
// add to new array
remainingPinpoints.push(image.pinpoints[i]);
}
}
// assign new array to pinpoints property
image.pinpoints = remainingPinpoints;
...
}