Пожалуй, самый комплексный метод для работы с массивом.
Он объединяет в себе две разные функциональности: удаляет часть массива и добавляет новые элементы на место удаленных.
При этом можно свести к нулю количество удаляемых элементов - тогда это будет просто добавление.
И можно не добавлять элементов - тогда это будет просто удаление.
Метод возвращает массив из удаленных элементов.
Пример: Удаление
arr = [ "a", "b", "c", "d", "e" ]
removed = arr.splice(1,2)
// removed = [ "b", "c"] (2 элемента с arr[1])
// arr = ["a", "d", "e"] (те что остались)
Пример: Удаление одного элемента
arr = [ "a", "b", "c", "d", "e" ]
// удалим с индекса 2 один элемент
arr.splice(2,1)
// arr = ["a", "b", "d", "e"]
Пример: Добавление элементов
arr = [ "a", "b", "c", "d", "e" ]
// начиная с индекса 2 удалим 0 элементов
// и добавим "b+"
arr.splice(2,0,"b+")
// arr = ["a", "b", "b+", "c", "d", "e"]
Пример: С конца
arr = [ "a", "b", "c", "d", "e" ]
// удалим с индекса 1 начиная с конца 1 элемент
arr.splice(-1,1)
Пример:
arr = [ "a,b,c", "d", "e" ]
из этого надо получить:
arr = [ "a", "b", "c", "d", "e" ]
------------------------------------
ведь можно и так:
var abc = arr.splice(0,1);
var res = abc.split(",").concat(arr);
у вас будет работать только в одном случае
вот правильынй вариант:
Ошибочка.
Вот так - правильно:
arr = [ "a,b,c", "d", "e" ]
var abc = arr.splice(0,1); // abc - это массив, а не строка
var res = abc[0].split(",").concat(arr);
Проблема с разной реализацией решается очень просто:
Обмен двух соседних элементов массива, аналог swap.
В index - адрес первого из меняемых
стоит упомянуть что данный метод изменяет оригинальный массив
Отлично. Я в javascript не эксперт, однако меня смутило поведение оператора delete, которое оставляет "дырки" со значением undefined в Array. Были опасения утечки памяти в долгоживущих скриптах. Теперь знаю, как грамотно можно удалить те или иные элементы.
IMHO, было бы полезно добавить в статью заметку о применении splice именно для удаления с акцентом на отличие от delete.
Беда здесь в том, что массив в js по сути есть объект класса Array со своим прототипом, содержащим различные методы для работы с ним, включая разобранный в статье, и числовые индексы в нем ничто иное, как просто ключи объекта со своими значениями. Это значит, что при вызове delete ключ просто удаляется из объекта, значение ключа теряет доступность и собирается сборщиком - память не захламляется, но при новом push в массив он будет вычислять новый индекс не по минимальному доступному значению ("дырке", как Вы выразились), а по максимальному + 1, и в долгоживущем скрипте это риск не потери памяти, а риск упереться в длину number, однако он крайне низок, если, конечно, Ваш скрипт не совершает ежесекундно по полтысячи операций добавления пустых значений (иначе память забьется быстрее, чем закончится number) в массив и не должен жить с течение месяцев. В случае же со splice мы сильно теряем в производительности - метод во время "вырезания" элементов начинает делать перестановки всех элементов, что сильно отжирает процессорное время, и если массив очень длинный, то одна такая операция потребует много времени, что, например, в играх (допустим, массив спрайтов, или данные об эффектах, частицах, коих вообще до черта может быть) может стать причиной проседания fps, поэтому более удобный Вам метод удаления элемента из массива следует выбирать исходя из особенностей работы Вашего js-приложения или скрипта. По сути, выбор между скоростью работы и долговечностью.