На этот вопрос есть несколько действительно творческих ответов. Вот простое решение для тех, кто только начинает работать с массивами. При желании его можно заставить работать вплоть до браузеров, совместимых с 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);
Таким образом, это решение больше похоже на реальный мир, чем любое другое из представленных до сих пор. Разве это не то, что вы сделали бы с Лего? ;-) Вот функция, выполненная методом №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()!!!!
Примечание. Использование оператора разбрасывания ...значительно упрощает выполнение всего этого.