Удаление элементов массива в JavaScript - удаление против сращивания - PullRequest
1277 голосов
/ 01 февраля 2009

В чем разница между использованием оператора delete в элементе массива и использованием метода Array.splice ?

Например:

myArray = ['a', 'b', 'c', 'd'];

delete myArray[1];
//  or
myArray.splice (1, 1);

Зачем даже метод сращивания, если я могу удалять элементы массива, как я могу с объектами?

Ответы [ 24 ]

1645 голосов
/ 01 февраля 2009

delete удалит свойство объекта, но не будет переиндексировать массив или обновить его длину. Это выглядит так, как будто оно не определено:

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> delete myArray[0]
  true
> myArray[0]
  undefined

Обратите внимание, что на самом деле ему не присвоено значение undefined, скорее свойство удаляется из массива, в результате чего отображается undefined. Инструменты разработчика Chrome проясняют это различие, печатая empty при регистрации массива.

> myArray[0]
  undefined
> myArray
  [empty, "b", "c", "d"]

myArray.splice(start, deleteCount) фактически удаляет элемент, переиндексирует массив и изменяет его длину.

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> myArray.splice(0, 2)
  ["a", "b"]
> myArray
  ["c", "d"]
331 голосов
/ 22 марта 2012

Метод Array.remove ()

Джон Резиг , создатель jQuery, создал очень удобный Array.remove метод, который я всегда использую в своих проектах.

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

и вот несколько примеров того, как это можно использовать:

// Remove the second item from the array
array.remove(1);
// Remove the second-to-last item from the array
array.remove(-2);
// Remove the second and third items from the array
array.remove(1,2);
// Remove the last and second-to-last items from the array
array.remove(-2,-1);

Сайт Джона

102 голосов
/ 01 февраля 2009

Поскольку delete удаляет только объект из элемента в массиве, длина массива не изменится. Splice удаляет объект и укорачивает массив.

В следующем коде будут отображаться "a", "b", "undefined", "d"

myArray = ['a', 'b', 'c', 'd']; delete myArray[2];

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}

Принимая во внимание, что это будет отображать «a», «b», «d»

myArray = ['a', 'b', 'c', 'd']; myArray.splice(2,1);

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}
65 голосов
/ 09 мая 2012

Я наткнулся на этот вопрос, пытаясь понять, как удалить каждое вхождение элемента из массива. Вот сравнение из splice и delete для удаления каждого 'c' из массива items.

var items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  items.splice(items.indexOf('c'), 1);
}

console.log(items); // ["a", "b", "d", "a", "b", "d"]

items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  delete items[items.indexOf('c')];
}

console.log(items); // ["a", "b", undefined, "d", "a", "b", undefined, "d"]
​
14 голосов
/ 01 февраля 2009

Из Справочник по ядру JavaScript 1.5> Операторы> Специальные операторы> Оператор удаления :

При удалении элемента массива длина массива не изменяется. За Например, если вы удалите [3], [4] будет все же a [4] и a [3] не определены. это держит, даже если вы удалите последний элемент массива (удалить а [a.length-1]).

9 голосов
/ 02 августа 2012

Вероятно, стоит упомянуть, что сплайс работает только с массивами. (На свойства объекта нельзя полагаться, чтобы они следовали последовательному порядку.)

Чтобы удалить пару ключ-значение из объекта, фактически удалите то, что вам нужно:

delete myObj.propName;     // , or:
delete myObj["propName"];  // Equivalent.
9 голосов
/ 11 января 2010

splice будет работать с числовыми индексами.

, тогда как delete может использоваться против других видов индексов ..

пример:

delete myArray['text1'];
8 голосов
/ 08 января 2016

Как уже много раз говорилось выше, использование splice() кажется идеальным выбором. Документация в Mozilla:

Метод splice() изменяет содержимое массива путем удаления существующих элементов и / или добавления новых элементов.

var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];

myFish.splice(2, 0, 'drum'); 
// myFish is ["angel", "clown", "drum", "mandarin", "sturgeon"]

myFish.splice(2, 1); 
// myFish is ["angel", "clown", "mandarin", "sturgeon"]

Синтаксис

array.splice(start)
array.splice(start, deleteCount)
array.splice(start, deleteCount, item1, item2, ...)

Параметры

1020 * начать * Индекс, с которого начинается изменение массива. Если он больше длины массива, фактический начальный индекс будет установлен равным длине массива. Если отрицательный, начнется так много элементов с конца. deleteCount

Целое число, указывающее количество удаляемых старых элементов массива. Если deleteCount равен 0, элементы не удаляются. В этом случае вы должны указать хотя бы один новый элемент. Если deleteCount больше, чем количество элементов, оставшихся в массиве, начиная с начала, то все элементы до конца массива будут удалены.

Если deleteCount не указан, deleteCount будет равен (arr.length - start).

item1, item2, ...

Элементы, добавляемые в массив, начиная с начального индекса. Если вы не укажете никаких элементов, splice() удалит только элементы из массива.

Возвращаемое значение

Массив, содержащий удаленные элементы. Если удаляется только один элемент, возвращается массив из одного элемента. Если элементы не удалены, возвращается пустой массив.

[...]

7 голосов
/ 20 июля 2014

delete действует как нереальная ситуация, просто удаляет элемент, но длина массива остается неизменной:

пример из узла терминала:

> var arr = ["a","b","c","d"];
> delete arr[2]
true
> arr
[ 'a', 'b', , 'd', 'e' ]

Вот функция для удаления элемента массива по индексу, используя slice () , она принимает arr в качестве первого аргумента, а индекс члена, который вы хотите удалить, как второй аргумент. Как видите, он фактически удаляет член массива и уменьшает длину массива на 1

function(arr,arrIndex){
    return arr.slice(0,arrIndex).concat(arr.slice(arrIndex + 1));
}

Функция, выполняемая выше, состоит в том, чтобы взять все элементы до индекса и всех членов после индекса, объединить их вместе и вернуть результат.

Вот пример использования вышеупомянутой функции в качестве модуля узла, где будет полезен терминал:

> var arr = ["a","b","c","d"]
> arr
[ 'a', 'b', 'c', 'd' ]
> arr.length
4 
> var arrayRemoveIndex = require("./lib/array_remove_index");
> var newArray = arrayRemoveIndex(arr,arr.indexOf('c'))
> newArray
[ 'a', 'b', 'd' ] // c ya later
> newArray.length
3

обратите внимание, что это не будет работать с одним массивом с дуплексами в нем, потому что indexOf ("c") просто получит первое вхождение, и только склеит и удалит первый найденный символ "c".

7 голосов
/ 06 августа 2016

удалить против сращивания

при удалении элемента из массива

var arr = [1,2,3,4]; delete arr[2]; //result [1, 2, 3:, 4]
console.log(arr)

при сращивании

var arr = [1,2,3,4]; arr.splice(1,1); //result [1, 3, 4]
console.log(arr);

в случае delete элемент удаляется , но индекс остается пустым

, в то время как в случае элемент сращивания удаляется, а индекс остальных элементов соответственно уменьшается

...