В 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); Это удаляет х и возвращает его, если вам это нужно.

См. https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/delete_Operator

например (из источника)

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;

    ...
}
Другие вопросы по тегам