Splice: примеры (JAVASCRIPT)

Метод splice для массивов в JavaScript: полный обзор
Раздел: Массивы, Изменение
splice(start, deleteCount?, ...items): array

Основы метода splice

Метод splice() — это встроенный метод массивов в JavaScript, предназначенный для изменения содержимого массива путем удаления, замены или добавления элементов. Он изменяет исходный массив и возвращает массив удаленных элементов.

Синтаксис:
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

Аргументы:

  • start — индекс, с которого начинается изменение массива. Если значение больше длины массива, start устанавливается равным длине массива. Отрицательный индекс указывает позицию с конца массива.
  • deleteCount (необязательный) — целое число, указывающее количество удаляемых элементов, начиная с позиции start. Если deleteCount равен 0 или опущен, элементы не удаляются.
  • item1, item2, ... (необязательные) — элементы, добавляемые в массив, начиная с индекса start. Если элементы не указаны, splice() только удаляет элементы.

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

Короткие примеры использования

Пример 1: Удаление элементов

let arr = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май'];
let removed = arr.splice(2, 2);
console.log(arr);
console.log(removed);
['Январь', 'Февраль', 'Май']
['Март', 'Апрель']

Пример 2: Добавление элементов

let arr = [1, 2, 5, 6];
let removed = arr.splice(2, 0, 3, 4);
console.log(arr);
console.log(removed);
[1, 2, 3, 4, 5, 6]
[]

Пример 3: Замена элементов

let arr = ['кошка', 'собака', 'мышь', 'хомяк'];
let removed = arr.splice(2, 1, 'попугай');
console.log(arr);
console.log(removed);
['кошка', 'собака', 'попугай', 'хомяк']
['мышь']

Пример 4: Использование отрицательного индекса

let arr = [10, 20, 30, 40, 50];
let removed = arr.splice(-2, 1);
console.log(arr);
console.log(removed);
[10, 20, 30, 50]
[40]

Похожие методы в JavaScript

slice(start, end) — возвращает новый массив, содержащий копию части исходного массива от start до end (не включая end). Исходный массив не изменяется. Используется для получения подмассива.

shift() — удаляет первый элемент из массива и возвращает его. Изменяет исходный массив. Эквивалентно arr.splice(0, 1).

pop() — удаляет последний элемент из массива и возвращает его. Изменяет исходный массив. Эквивалентно arr.splice(-1, 1).

unshift(...items) — добавляет элементы в начало массива. Изменяет исходный массив. Эквивалентно arr.splice(0, 0, ...items).

push(...items) — добавляет элементы в конец массива. Изменяет исходный массив. Эквивалентно arr.splice(arr.length, 0, ...items).

Методы slice и splice часто путают из-за схожих названий. slice не изменяет массив, splice изменяет.

Типичные ошибки

1. Непонимание мутации исходного массива. Метод изменяет массив, на котором вызывается.

let original = [1, 2, 3];
let copy = original;
copy.splice(0, 1);
console.log(original); // Изменился и original!
[2, 3]

2. Ожидание, что splice возвращает новый массив. Возвращается массив удаленных элементов, а не измененный массив.

let arr = [1, 2, 3];
let result = arr.splice(0, 1);
console.log(result); // [1], а не [2, 3]
[1]

3. Неправильное использование deleteCount при добавлении. Если deleteCount не указан или равен 0, элементы не удаляются.

let arr = [10, 20, 30];
arr.splice(1); // Второй аргумент не указан, удаляет ВСЕ элементы с индекса 1 до конца
console.log(arr);
[10]

4. Путаница между slice и splice.

let arr = [100, 200, 300];
let a = arr.slice(1, 2); // [200]
let b = arr.splice(1, 2); // [200, 300]
console.log(arr); // [100]
[100]

Изменения в последних версиях

Спецификация метода splice() остается стабильной в стандарте ECMAScript. Существенных изменений в поведении не было. Однако, с введением стандартов ES6/ES2015+, метод стал чаще использоваться в сочетании с оператором расширения (...) для передачи массива добавляемых элементов.

// ES6+ стиль с spread оператором
let itemsToAdd = ['x', 'y', 'z'];
let arr = ['a', 'b', 'c'];
arr.splice(1, 0, ...itemsToAdd);
console.log(arr);
['a', 'x', 'y', 'z', 'b', 'c']

Расширенные примеры

Пример 1: Удаление с конца без указания точного количества

Пример javascript
let arr = [1, 2, 3, 4, 5, 6, 7];
// Удалить последние 3 элемента
let removed = arr.splice(-3);
console.log(arr);
console.log(removed);
[1, 2, 3, 4]
[5, 6, 7]

Пример 2: Сдвиг элементов при вставке в середину

Пример javascript
let arr = [];
arr[5] = 'элемент';
console.log('До:', arr);
// Вставка в разреженный массив
arr.splice(2, 0, 'новый');
console.log('После:', arr);
console.log('Длина:', arr.length);
До: [ <5 empty items>, 'элемент' ]
После: [ <2 empty items>, 'новый', <3 empty items>, 'элемент' ]
Длина: 7

Пример 3: Замена с использованием данных из массива

Пример javascript
let data = ['яблоко', 'апельсин', 'банан', 'виноград'];
let newFruits = ['киви', 'манго'];
// Заменить 'апельсин' и 'банан' на 'киви' и 'манго'
let removed = data.splice(1, 2, ...newFruits);
console.log(data);
console.log(removed);
['яблоко', 'киви', 'манго', 'виноград']
['апельсин', 'банан']

Пример 4: Очистка массива с помощью splice

Пример javascript
let arr = [1, 2, 3, 4, 5];
let removed = arr.splice(0); // Удаляет все элементы
console.log(arr);
console.log(removed);
[]
[1, 2, 3, 4, 5]

Пример 5: Использование в функциях-обработчиках для изменения массива объектов

Пример javascript
let tasks = [
  {id: 1, title: 'Купить продукты'},
  {id: 2, title: 'Прочитать книгу'},
  {id: 3, title: 'Сделать зарядку'}
];
// Удалить задачу с id=2 и добавить новую на ее место
let index = tasks.findIndex(task => task.id === 2);
if (index !== -1) {
  tasks.splice(index, 1, {id: 4, title: 'Выучить JavaScript'});
}
console.log(tasks.map(t => t.title));
['Купить продукты', 'Выучить JavaScript', 'Сделать зарядку']

Пример 6: Псевдомассивы и splice. Метод splice является общим и может быть использован с объектами, похожими на массивы, через call/apply.

Пример javascript
function example() {
  // arguments - псевдомассив
  let args = Array.prototype.slice.call(arguments);
  args.splice(1, 1);
  console.log(args);
}
example('первый', 'второй', 'третий');
['первый', 'третий']

Аналоги в других языках программирования

Python (list): Используется срез (slice) и методы списка. Прямого аналога нет, так как списки Python иммутабельны для таких операций — создается новый список.

# Удаление и замена (создание нового списка)
arr = [1, 2, 3, 4, 5]
arr = arr[:2] + [9, 10] + arr[3:]
print(arr)  # [1, 2, 9, 10, 4, 5]

# Метод pop(i) удаляет по индексу
removed = arr.pop(1)
print(removed)  # 2
[1, 2, 9, 10, 4, 5]
2

PHP (array_splice): Функция array_splice работает аналогично, изменяя исходный массив.

$arr = ['a', 'b', 'c', 'd'];
$removed = array_splice($arr, 1, 2, ['x', 'y']);
print_r($arr);
print_r($removed);
Array ( [0] => a [1] => x [2] => y [3] => d )
Array ( [0] => b [1] => c )

C++ (std::vector): Используются методы erase и insert, часто в комбинации.

// Условный пример на C++
std::vector vec = {1, 2, 3, 4, 5};
vec.erase(vec.begin() + 1, vec.begin() + 3); // Удаляет элементы с 1 по 3
// Результат: {1, 4, 5}

Java (ArrayList): Метод subList в сочетании с clear или addAll.

// Условный пример на Java
ArrayList list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
list.subList(1, 3).clear(); // Удаляет элементы с индекса 1 до 3 (не включая)
// Результат: [1, 4, 5]

JS splice function comments

En
Splice Changes the contents of an array by removing or replacing existing elements and/or adding new elements