В javascript, как удалить элемент из массива объектов?
В 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
это массив объектов. Еще раз спасибо, ребята!
3 ответа
.splice
это метод, приведенный на w3schools.com http://www.w3schools.com/jsref/jsref_splice.asp Чтобы удалить один элемент из массива с индексом x, вы должны иметь trees.splice(x,x+1);
Это удаляет х и возвращает его, если вам это нужно.
например (из источника)
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
будет работать по-другому, так как удаление создает дыру в массиве и устанавливает значение удаленного свойства в 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;
...
}