В javascript, как удалить элемент из массива объектов? - PullRequest
4 голосов
/ 12 июля 2010

Как в 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 ]

4 голосов
/ 12 июля 2010

См. 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  
}  
1 голос
/ 12 июля 2010

.splice - метод, указанный на w3schools.com http://www.w3schools.com/jsref/jsref_splice.asp Чтобы удалить один элемент из массива с индексом x, у вас будет trees.splice(x,x+1); Это удаляет x и возвращает его, если вам это нужно.

1 голос
/ 12 июля 2010

Я думаю, вы должны перефразировать вопрос, чтобы быть более ясным.Из вашего примера видно, что несколько элементов могут быть удалены из массива 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;

    ...
}
...