Avatar ·

Как вставить элемент в массив по указанному индексу в JavaScript?

Всем привет! Я только начал изучать JavaScript и столкнулся с проблемой при работе с массивами. Мне нужно вставить новый элемент не в конец или начало массива, а в середину — по определённому индексу. Например, у меня есть массив чисел `[1, 2, 4, 5]`, и я хочу вставить число `3` на позицию с индексом 2 (чтобы получилось `[1, 2, 3, 4, 5]`). Я знаю про методы `push()` (добавляет в конец) и `unshift()` (добавляет в начало), но они не подходят. Пробовал написать что-то вроде: ```javascript let arr = [1, 2, 4, 5]; arr[2] = 3; console.log(arr); // [1, 2, 3, 5] — число 4 пропало! ``` Как видите, простое присваивание по индексу заменяет существующий элемент, а не вставляет новый. Как мне вставить элемент так, чтобы остальные сдвинулись вправо? Подскажите, пожалуйста, есть ли в JavaScript встроенный метод для этого? Или нужно писать свою функцию? Буду благодарен за примеры с объяснением! <<>>

Использование метода splice() — стандартное решение

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

Синтаксис для вставки

array.splice(index, 0, element1, element2, ...)
  • index — индекс, начиная с которого будут вставляться элементы.
  • 0 — количество удаляемых элементов (0 означает, что ничего не удаляется).
  • element1, element2, ... — элементы для вставки (можно вставить один или несколько).

Пример для вашей задачи

let arr = [1, 2, 4, 5];
arr.splice(2, 0, 3); // Вставляем число 3 на позицию с индексом 2
console.log(arr); // [1, 2, 3, 4, 5]

Как это работает: метод берёт массив, находит позицию с индексом 2 (где сейчас находится число 4), сдвигает все элементы, начиная с этой позиции, вправо, и вставляет новое значение. В результате массив увеличивается на один элемент.

Вставка нескольких элементов

let colors = ['red', 'green', 'blue'];
colors.splice(1, 0, 'yellow', 'pink');
console.log(colors); // ['red', 'yellow', 'pink', 'green', 'blue']

Важные особенности

  • Изменение исходного массива: splice() мутирует (изменяет) исходный массив. Если нужно сохранить оригинал, сначала сделайте копию: let copy = [...arr];.
  • Возвращаемое значение: метод возвращает массив удалённых элементов. При вставке с параметром 0 он вернёт пустой массив.
  • Отрицательные индексы: можно использовать отрицательные значения для отсчёта с конца массива. Например, arr.splice(-1, 0, 'new') вставит элемент перед последним.
  • Индекс за пределами длины: если указать индекс больше длины массива, элемент будет вставлен в конец.

Альтернатива без мутации (чистая функция)

Если вы предпочитаете не изменять исходный массив, можно использовать slice() и конкатенацию:

function insertAt(arr, index, ...elements) {
  return [
    ...arr.slice(0, index),
    ...elements,
    ...arr.slice(index)
  ];
}

let original = [1, 2, 4, 5];
let newArr = insertAt(original, 2, 3);
console.log(newArr); // [1, 2, 3, 4, 5]
console.log(original); // [1, 2, 4, 5] — без изменений

Метод splice() — это самый простой и производительный способ для вставки элементов. Он поддерживается всеми современными браузерами и средами Node.js. Используйте его, когда нужно быстро и наглядно модифицировать массив.

<<>>

Использование toSpliced() — современный подход (ES2023+)

Начиная с ES2023 (современный стандарт JavaScript), появился метод toSpliced(). Он работает как splice(), но не изменяет исходный массив, а возвращает новый. Это удобно в функциональном программировании и при работе с иммутабельными данными.

Пример

let arr = [1, 2, 4, 5];
let newArr = arr.toSpliced(2, 0, 3);
console.log(newArr); // [1, 2, 3, 4, 5]
console.log(arr); // [1, 2, 4, 5] — исходный не изменился

Когда использовать?

  • Если вы работаете с React или Redux и не хотите мутировать состояние.
  • Если нужно сохранить оригинальный массив для дальнейшего использования.
  • В цепочках методов, где важна чистота функций.

Ограничения

Метод toSpliced() пока поддерживается не во всех средах (требуются современные браузеры или Node.js 20+). Для старых проектов используйте splice() или комбинацию slice() + spread-оператор, как показано в первом ответе.

Выбор между splice() и toSpliced() зависит от ваших потребностей: первый — для прямого изменения, второй — для создания новой копии. Оба решают задачу вставки элемента по индексу.