Istnieje kilka naprawdę twórczych odpowiedzi na to pytanie. Oto proste rozwiązanie dla tych, którzy dopiero zaczynają przygodę z tablicami. W razie potrzeby można go zmusić do pracy aż do przeglądarek zgodnych z ECMAScript 3.
Dowiedz się czegoś o łączeniu, zanim zaczniesz.
Mozilla Developer Network: Array.prototype.splice ()
Najpierw poznaj dwie ważne formy .splice()
.
let a1 = [1,2,3,4],
a2 = [1,2];
Metoda 1) Usuń elementy x (deleteCount), zaczynając od żądanego indeksu.
let startIndex = 0,
deleteCount = 2;
a1.splice(startIndex, deleteCount);
Metoda 2) Usuń elementy po żądanym indeksie początkowym do końca tablicy.
a1.splice(2);
Używając .splice()
, celem może być podzielenie a1
na układy głowy i ogona przy użyciu jednej z dwóch powyższych form.
Korzystając z metody nr 1, zwracana wartość byłaby głową i a1
końcem.
let head = a1.splice(startIndex, deleteCount);
Teraz za jednym zamachem połącz głowę, ciało ( a2
) i ogon
[].concat(head, a2, a1);
Tym samym rozwiązanie to bardziej przypomina rzeczywisty świat niż jakiekolwiek inne prezentowane do tej pory. Czy nie to byś zrobił z Legosem? ;-) Oto funkcja wykonywana przy użyciu metody nr 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);
Krótszy:
function insertArray(target, body, startIndex)
{
return [].concat(target, body, target.splice(startIndex));
}
Bezpieczniej:
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));
}
Zalety tego rozwiązania to:
1) W rozwiązaniu dominuje proste założenie - wypełnij pustą tablicę.
2) Nazewnictwo głowy, ciała i ogona jest naturalne.
3) Brak podwójnego wywołania .slice()
. Żadnego krojenia.
4) Nie .apply()
. Wysoce niepotrzebne.
5) Unika się łączenia metod.
6) Działa w ECMAScript 3 i 5 po prostu używając var
zamiast let
lub const
.
** 7) Zapewnia, że będzie głowa i ogon do uderzenia w ciało, w przeciwieństwie do wielu innych przedstawionych rozwiązań. Jeśli dodajesz tablicę przed lub po granicach, powinieneś przynajmniej użyć .concat()
!!!!
Uwaga: użycie opearatora do rozprzestrzeniania ...
sprawia, że wszystko to jest znacznie łatwiejsze do wykonania.