Тут є кілька справді творчих відповідей на це питання. Ось просте рішення для тих, хто тільки починає з масивів. За бажанням його можна працювати аж до браузерів, сумісних із ECMAScript 3.
Дізнайтеся щось про сплайсинг перед початком роботи.
Мережа розробників Mozilla: Array.prototype.splice ()
По-перше, зрозуміти дві важливі форми .splice()
.
let a1 = [1,2,3,4],
a2 = [1,2];
Спосіб 1) Видаліть x (deleteCount) елементів, починаючи з потрібного індексу.
let startIndex = 0,
deleteCount = 2;
a1.splice(startIndex, deleteCount);
Спосіб 2) Видалення елементів після бажаного індексу початку до кінця масиву.
a1.splice(2);
Використовуючи .splice()
, метою може бути розділення a1
на масиви голови та хвоста, використовуючи одну з двох наведених вище форм.
За допомогою методу №1 повернене значення стане головою та a1
хвостом.
let head = a1.splice(startIndex, deleteCount);
Тепер одним махом з’єднайте голову, тіло ( a2
) і хвіст
[].concat(head, a2, a1);
Таким чином, це рішення більше нагадує реальний світ, ніж будь-яке інше, представлене досі. Хіба це не те, що ви робили б із Legos? ;-) Ось функція, виконана за допомогою методу №2.
function insertArray(target, body, startIndex)
{
let tail = target.splice(startIndex);
return [].concat(target, body, tail);
}
let newArray = insertArray([1, 2, 3, 4], ["a", "b"], 2);
Коротше:
function insertArray(target, body, startIndex)
{
return [].concat(target, body, target.splice(startIndex));
}
Безпечніше:
function insertArray(target, body, startIndex)
{
const ARRAY_START = 0,
ARRAY_END = target.length - 1,
ARRAY_NEG_END = -1,
START_INDEX_MAGNITUDE = Math.abs(startIndex);
if (startIndex === ARRAY_START) {
throw new Error("The value for startIndex cannot be zero (0).");
}
if (startIndex === ARRAY_END || startIndex === ARRAY_NEG_END) {
throw new Error("The startIndex cannot be equal to the last index in target, or -1.");
}
if (START_INDEX_MAGNITUDE >= ARRAY_END) {
throw new Error("The absolute value of startIndex must be less than the last index.");
}
return [].concat(target, body, target.splice(startIndex));
}
До переваг цього рішення належать:
1) У рішенні домінує проста умова - заповнити порожній масив.
2) Номенклатура голови, тіла та хвоста відчуває себе природно.
3) Немає подвійного дзвінка .slice()
. Нарізки взагалі відсутні.
4) Ні .apply()
. Вкрай непотрібне.
5) Уникання ланцюгових методів.
6) Працює в ECMAScript 3 і 5, просто використовуючи var
замість let
або const
.
** 7) Забезпечує наявність голови та хвоста, щоб ляпати по тілу, на відміну від багатьох інших запропонованих рішень. Якщо ви додаєте масив до або після меж, ви повинні принаймні використовувати .concat()
!!!!
Примітка: Використання оператора розповсюдження ...
робить все це набагато простішим у виконанні.