Javascript.RU

splice

Синтаксис

arrayObj.splice( start, deleteCount, [elem1[, elem2[, ...[, elemN]]]] )

Аргументы

start
Индекс в массиве, с которого начинать удаление.
deleteCount
Кол-во элементов, которое требуется удалить, начиная с индекса start.
  • IE: если этот параметр не указан, то ни один элемент не будет удалён.
  • Firefox: если этот параметр не указан, то будут удалены все элементы, начиная с индекса start.
  • Opera: (исследовано в версии 9.61) если этот параметр не указан, то будут удалён 1 элемент, имеющий индекс start+1. В этом же случае вместо удалённого элемента будет возвращена пустая строка.
elem1, elem2, ..., elemN
Добавляемые элементы в массив. Добавление начинается с позиции start.

Описание, примеры

Пожалуй, самый комплексный метод для работы с массивом.

Он объединяет в себе две разные функциональности: удаляет часть массива и добавляет новые элементы на место удаленных.

При этом можно свести к нулю количество удаляемых элементов - тогда это будет просто добавление.

И можно не добавлять элементов - тогда это будет просто удаление.

Метод возвращает массив из удаленных элементов.

Пример: Удаление
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)

Автор: elser (не зарегистрирован), дата: 2 февраля, 2011 - 14:25
#permalink

Пример:
arr = [ "a,b,c", "d", "e" ]
из этого надо получить:
arr = [ "a", "b", "c", "d", "e" ]
------------------------------------

ведь можно и так:

var abc = arr.splice(0,1);
var res = abc.split(",").concat(arr);


Автор: VIT (не зарегистрирован), дата: 13 апреля, 2011 - 21:15
#permalink

у вас будет работать только в одном случае
вот правильынй вариант:

arr=arr.join(',');
arr=arr.split(',');

Автор: mowsar, дата: 16 июля, 2015 - 01:23
#permalink
arr = [ "a,b,c", "d", "e" ];

var abc = arr.splice(0,1); //abc щас имеет тип object
//что бы применить метод split() необходимо abc превратить в строковый тип (string)
//для етого воспользуемся методом toString()
//далее split() превратит ее в массив
var abc2Arr = abc.toString().split(',');
//теперь склеиваем 2 массива
res = abc2Arr.concat(arr);

console.log(res); // ["a", "b", "c", "d", "e"]

Автор: Гость (не зарегистрирован), дата: 27 сентября, 2016 - 19:31
#permalink

Ошибочка.
Вот так - правильно:
arr = [ "a,b,c", "d", "e" ]
var abc = arr.splice(0,1); // abc - это массив, а не строка
var res = abc[0].split(",").concat(arr);


Автор: termi_uc, дата: 30 марта, 2012 - 08:37
#permalink

Проблема с разной реализацией решается очень просто:

;(function(_origArraySplice) {
if([1,2].splice(0).length != 2) {
	Array.prototype.splice = function(index, howMany) {
		return _origArraySplice.call(
			this, 
			index,
			howMany === void 0 ? 
				(this.length - index) : 
				howMany,
			Array.prototype.slice.call(arguments, 2)
			)
	}
}
})(Array.prototype.splice);

Автор: Дмитрий Минаев (не зарегистрирован), дата: 2 мая, 2012 - 15:25
#permalink

Обмен двух соседних элементов массива, аналог swap.
В index - адрес первого из меняемых

array.splice(index, 2, array[index + 1], array[index]);

Автор: Гость (не зарегистрирован), дата: 23 октября, 2012 - 02:29
#permalink

стоит упомянуть что данный метод изменяет оригинальный массив


Автор: Invis1ble, дата: 21 января, 2013 - 18:20
#permalink

Отлично. Я в javascript не эксперт, однако меня смутило поведение оператора delete, которое оставляет "дырки" со значением undefined в Array. Были опасения утечки памяти в долгоживущих скриптах. Теперь знаю, как грамотно можно удалить те или иные элементы.
IMHO, было бы полезно добавить в статью заметку о применении splice именно для удаления с акцентом на отличие от delete.


Автор: Zaklinatel (не зарегистрирован), дата: 19 марта, 2014 - 05:00
#permalink

Беда здесь в том, что массив в js по сути есть объект класса Array со своим прототипом, содержащим различные методы для работы с ним, включая разобранный в статье, и числовые индексы в нем ничто иное, как просто ключи объекта со своими значениями. Это значит, что при вызове delete ключ просто удаляется из объекта, значение ключа теряет доступность и собирается сборщиком - память не захламляется, но при новом push в массив он будет вычислять новый индекс не по минимальному доступному значению ("дырке", как Вы выразились), а по максимальному + 1, и в долгоживущем скрипте это риск не потери памяти, а риск упереться в длину number, однако он крайне низок, если, конечно, Ваш скрипт не совершает ежесекундно по полтысячи операций добавления пустых значений (иначе память забьется быстрее, чем закончится number) в массив и не должен жить с течение месяцев. В случае же со splice мы сильно теряем в производительности - метод во время "вырезания" элементов начинает делать перестановки всех элементов, что сильно отжирает процессорное время, и если массив очень длинный, то одна такая операция потребует много времени, что, например, в играх (допустим, массив спрайтов, или данные об эффектах, частицах, коих вообще до черта может быть) может стать причиной проседания fps, поэтому более удобный Вам метод удаления элемента из массива следует выбирать исходя из особенностей работы Вашего js-приложения или скрипта. По сути, выбор между скоростью работы и долговечностью.


 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние темы на форуме
Forum