Коротка відповідь
middleМетод `splice` змінює масив, видаляючи або вставляючи елементи. Він повертає новий масив з видаленими елементами, а оригінальний змінюється. Приклад: `arr.splice(2, 1, 'a', 'b')` видаляє елемент з індексом 2 і вставляє `a`, `b`.
Повне пояснення
Що це і навіщо
Array.prototype.splice дозволяє модифікувати масив у‑порядку: видаляти, вставляти або замінювати елементи. Повертає масив видалених значень, що корисно для логування чи подальшої обробки.
Принцип роботи / алгоритм
- Перший аргумент – початковий індекс (може бути негативним).
- Другий аргумент – кількість видалень.
- Решта аргументів – нові елементи, що вставляються.
- Масив розтягується або стискається відповідно до різниці між кількістю вставок і видалень.
Реалізація (JS / TS)
function splice<T>(arr: T[], start: number, deleteCount?: number, ...items: T[]): T[] {
const len = arr.length;
let actualStart = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);
const actualDelete = deleteCount === undefined ? len - actualStart : Math.min(Math.max(deleteCount, 0), len - actualStart);
const removed = arr.slice(actualStart, actualStart + actualDelete);
const restAfter = arr.slice(actualStart + actualDelete);
arr.length = actualStart;
arr.push(...items, ...restAfter);
return removed;
}
Тестування
import { test, expect } from 'vitest';
test('splice removes and inserts', () => {
const a = [1,2,3,4];
const removed = splice(a, 1, 2, 'x', 'y');
expect(removed).toEqual([2,3]);
expect(a).toEqual([1,'x','y',4]);
});
Проблеми та edge cases
- Негативний start – обчислюється від кінця.
- deleteCount > залишок – видаляє до кінця.
- deleteCount === undefined – видаляє все після start.
- items = [] – лише видалення без вставки.
- Масив з гетерогенними типами – повертає правильний тип
any.
Оптимізація та продуктивність
Для великих масивів використання Array.prototype.splice вбудоване і оптимізоване, але ручна реалізація через slice + push може бути менш ефективною.
Без JS / архітектурні альтернативи
У випадку, коли потрібна лише вставка/видалення без зміни оригіналу, можна створити новий масив: const newArr = [...arr.slice(0,start), ...items, ...arr.slice(start+deleteCount)].
Cheatsheet + follow-up
spliceзмінює масив in‑place.- Повертає видалені елементи, а не новий масив.
Потенційне інтерв’ю питання: Як splice поводиться, коли deleteCount дорівнює 0?