Ответ 1
.splice
- это метод, приведенный на w3schools.com http://www.w3schools.com/jsref/jsref_splice.asp
Чтобы удалить один элемент из массива с индексом x, у вас будет trees.splice(x,x+1);
Это удаляет x и возвращает его, если вам это нужно.
В javascript, как удалить элемент из массива объектов? Вот код:
$.fn.mapImage.deletePinpoint = function(image, pinpoint){
var deleted = false;
for (var i = 0; i < image.pinpoints.length; i++) {
if(image.pinpoints[i].position == pinpoint.position){
image.pinpoints.remove(i);
deleted = true;
}
if(deleted){
image.pinpoints[i].position -= 1;
}
}
$('.edit-mode').find('div.dynamic-pinpoint-area').remove();
$('.edit-mode').find('div.pinpoint-text').remove();
$('.create-mode').find('div.static-pinpoint-area').remove();
$('.create-mode').find('div.pinpoint-text').remove();
$.fn.mapImage.load(image);
}
image.pinpoints
- массив объектов. Еще раз спасибо ребятам!
.splice
- это метод, приведенный на w3schools.com http://www.w3schools.com/jsref/jsref_splice.asp
Чтобы удалить один элемент из массива с индексом x, у вас будет trees.splice(x,x+1);
Это удаляет x и возвращает его, если вам это нужно.
например. (из источника)
var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
if (3 in trees) {
// this does not get executed
}
Я думаю, вы должны перефразировать вопрос, чтобы быть более ясным. Из вашего примера, похоже, что несколько элементов могут быть удалены из массива 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 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;
...
}