В 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 - массив объектов. Еще раз спасибо ребятам!

Ответ 1

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

Ответ 3

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

    ...
}