Heute, im fünften Teil der JavaScript-Kursübersetzung, werden wir über Arrays und Loops sprechen. Arrays werden verwendet, um viele Probleme zu lösen. Arbeiten Sie häufig mit Arrays mithilfe von Schleifen.
→
Teil 1: Erstes Programm, Sprachfunktionen, Standards→
Teil 2: Codestil und Programmstruktur→
Teil 3: Variablen, Datentypen, Ausdrücke, Objekte→
Teil 4: Funktionen→
Teil 5: Arrays und Loops→
Teil 6: Ausnahmen, Semikolons, Platzhalterliterale→
Teil 7: Strict Mode, dieses Schlüsselwort, Ereignisse, Module, mathematische Berechnungen→
Teil 8: Übersicht über die ES6-Funktionen→
Teil 9: Übersicht über die ES7-, ES8- und ES9-Standards
Arrays
Arrays, Objekte vom Typ
Array
, entwickeln sich zusammen mit anderen Mechanismen der Sprache. Sie sind Listen mit nummerierten Werten.
Das erste Element des Arrays hat einen Index (Schlüssel) von 0, dieser Ansatz wird in vielen Programmiersprachen verwendet.
In diesem Abschnitt werden moderne Methoden zum Arbeiten mit Arrays betrachtet.
▍Initialisieren von Arrays
Hier sind einige Möglichkeiten, Arrays zu initialisieren.
const a = [] const a = [1, 2, 3] const a = Array.of(1, 2, 3) const a = Array(6).fill(1)
Verwenden Sie ein Konstrukt aus eckigen Klammern, die den Index des Array-Elements enthalten, um auf ein einzelnes Element des Arrays zuzugreifen. Array-Elemente können entweder gelesen oder geschrieben werden.
const a = [1, 2, 3] console.log(a)
Der
Array
Konstruktor zum Deklarieren von Arrays wird nicht empfohlen.
const a = new Array()
Diese Methode sollte nur verwendet werden, wenn
typisierte Arrays deklariert werden.
▍Ermitteln der Länge des Arrays
Um die Länge eines Arrays herauszufinden, müssen Sie auf seine Eigenschaft
length
verweisen.
const l = a.length
▍Überprüfen eines Arrays mit der Methode every ()
Mit der Array-Methode
every()
kann die Überprüfung aller ihrer Elemente unter bestimmten Bedingungen organisiert werden. Wenn alle Elemente des Arrays die Bedingung erfüllen, gibt die Funktion
true
, andernfalls
false
.
Dieser Methode wird eine Funktion übergeben, die die Argumente
currentValue
(aktuelles Array-Element),
index
(Index des aktuellen Array-Elements) und
array
(das Array selbst) verwendet. Es kann auch einen optionalen Wert annehmen, der bei der Ausführung der an ihn übergebenen Funktion verwendet wird.
Überprüfen Sie beispielsweise, ob die Werte aller Elemente des Arrays größer als 10 sind.
const a = [11, 12, 13] const b = [5, 6, 25] const test = el => el > 10 console.log(a.every(test))
Hier interessiert uns in der Funktion
test()
nur das erste Argument, das an sie übergeben wird. Daher deklarieren wir es und geben nur den Parameter
el
, in den der entsprechende Wert fällt.
▍Überprüfen eines Arrays mit der some () -Methode
Diese Methode ist der Methode
every()
sehr ähnlich, gibt jedoch
true
zurück
true
wenn mindestens eines der Elemente des Arrays die Bedingung erfüllt, die von der an sie übergebenen Funktion angegeben wird.
▍Erstellen Sie ein Array basierend auf einem vorhandenen Array mit der map () -Methode
Mit der
map()
-Methode von Arrays können Sie über Arrays iterieren und auf jedes an diese Methode übergebene Element eine Funktion anwenden, die das Element konvertiert und aus den empfangenen Werten neue Arrays erstellt. Hier erfahren Sie beispielsweise, wie Sie ein neues Array erhalten. Dies ist das Ergebnis der Multiplikation aller Elemente des ursprünglichen Arrays mit 2.
const a = [1, 2, 3] const double = el => el * 2 const doubleA = a.map(double) console.log(a)
▍ Filtern eines Arrays mit der filter () -Methode
Die
filter()
-Methode ähnelt der
map()
-Methode, ermöglicht jedoch das Erstellen neuer Arrays, die nur die Elemente der ursprünglichen Arrays enthalten, die die durch die an die Funktion übergebene
filter()
-Methode angegebene Bedingung erfüllen.
▍ redu () -Methode
Mit der Methode
reduce()
können Sie eine bestimmte Funktion auf den Akkumulator und auf jeden Wert des Arrays anwenden und das Array auf einen einzelnen Wert reduzieren (dieser Wert kann entweder ein Grundelement oder einen Objekttyp haben). Diese Methode übernimmt eine Konvertierungsfunktion und einen optionalen anfänglichen Batteriewert. Betrachten Sie ein Beispiel.
const a = [1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) => { return accumulator * currentValue }, 1) console.log(a)
Hier suchen wir nach dem Produkt aller Elemente des Arrays, das mit einem Literal beschrieben wurde, wobei der Anfangswert von Akkumulator 1 festgelegt wird.
▍ Auflisten eines Arrays mit der Methode forEach ()
Die
forEach()
-Methode von Arrays kann verwendet werden, um die Werte von Arrays zu durchlaufen und bestimmte Aktionen auszuführen, die durch die an die Methode übergebene Funktion angegeben werden. Beispielsweise zeigen wir nacheinander die Elemente des Arrays in der Konsole an.
const a = [1, 2, 3] a.forEach(el => console.log(el))
Wenn Sie die Schleife stoppen oder unterbrechen müssen, wenn Sie über ein Array iterieren, müssen Sie bei Verwendung von
forEach()
eine Ausnahme auslösen. Wenn es daher im Verlauf der Lösung eines bestimmten Problems erforderlich sein kann, den Zyklus zu unterbrechen, ist es am besten, einen anderen Weg zu wählen, um über die Array-Elemente zu iterieren.
▍Auswählen eines Arrays mit dem Operator for ... of
Der
for...of
Operator ist im ES6-Standard enthalten. Sie können damit über iterierbare Objekte (einschließlich Arrays) iterieren. Hier erfahren Sie, wie Sie es verwenden.
const a = [1, 2, 3] for (let v of a) { console.log(v) }
Bei jeder Iteration der Schleife gelangt das nächste Element des Arrays
a
in die Variable
v
.
▍ Auflisten eines Arrays mit der for-Anweisung
Mit der
for
Anweisung können Sie Schleifen organisieren, die insbesondere zum Durchlaufen (oder Initialisieren) von Arrays verwendet werden können, indem auf deren Elemente über den Index zugegriffen wird. Typischerweise wird der Index des nächsten Elements unter Verwendung eines Schleifenzählers erhalten.
const a = [1, 2, 3] for (let i = 0; i < a.length; i += 1) { console.log(a[i]) }
Wenn Sie während der Ausführung der Schleife deren Iteration überspringen müssen, können Sie den Befehl
continue
. Um den Zyklus vorzeitig zu beenden, können Sie den Befehl
break
. Wenn Sie den Befehl
return
in einer Schleife verwenden, die sich in einer bestimmten Funktion befindet, werden die Schleife und die Funktion beendet, und der mit
return
Wert wird an die Stelle verschoben, an der die Funktion aufgerufen wurde.
▍ Methode @@ Iterator
Diese Methode ist im ES6-Standard enthalten. Damit können Sie den sogenannten "Iterator eines Objekts" abrufen - ein Objekt, mit dem Sie in diesem Fall eine Iteration von Array-Elementen organisieren können. Ein Array-Iterator kann unter Verwendung des Symbols erhalten werden (solche Symbole werden als "bekannte Symbole" bezeichnet).
Symbol.iterator
. Nach dem Empfang des Iterators können Sie auf die
next()
-Methode zugreifen, die bei jedem Aufruf eine Datenstruktur zurückgibt, die das nächste Element des Arrays enthält.
const a = [1, 2, 3] let it = a[Symbol.iterator]() console.log(it.next().value)
Wenn Sie die
next()
-Methode aufrufen, nachdem das letzte Element des Arrays erreicht wurde, wird als Wert des Elements
undefined
. Das von der
next()
-Methode zurückgegebene Objekt enthält den
value
und die
done
Eigenschaften. Die Eigenschaft
done
als
false
ausgewertet, bis das letzte Element des Arrays erreicht ist. In unserem Fall gibt es beim vierten Aufruf von
it.next()
das Objekt
{ value: undefined, done: true }
, während dieses Objekt in den vorherigen drei Aufrufen wie
{ value: , done: false }
aussehen würde.
Die Array-Methode entry
entries()
gibt einen Iterator zurück, mit dem Sie die Schlüssel-Wert-Paare des Arrays durchlaufen können.
const a = [1, 2, 3] let it = a.entries() console.log(it.next().value)
Mit der Methode
keys()
können Sie die Schlüssel eines Arrays durchlaufen.
const a = [1, 2, 3] let it = a.keys() console.log(it.next().value)
▍ Hinzufügen von Elementen zum Ende eines Arrays
Verwenden Sie die
push()
-Methode, um Elemente am Ende des Arrays hinzuzufügen.
a.push(4)
▍ Hinzufügen von Elementen zum Anfang des Arrays
Verwenden Sie die Methode
unshift()
um Elemente am Anfang des Arrays
unshift()
.
a.unshift(0) a.unshift(-2, -1)
▍Entfernen von Array-Elementen
Sie können ein Element vom Ende des Arrays entfernen, während Sie dieses Element mit der
pop()
-Methode zurückgeben.
a.pop()
In ähnlicher Weise können Sie mit der Methode
shift()
ein Element vom Anfang des Arrays entfernen.
a.shift()
Das Gleiche, aber bereits die Position der Entfernung von Elementen und ihre Anzahl anzeigend, erfolgt mit der Methode
splice()
.
a.splice(0, 2)
▍Entfernen von Array-Elementen und Einfügen anderer Elemente
Um einige Operationen zu verwenden, um einige Elemente des Arrays zu entfernen und stattdessen andere Elemente einzufügen, wird die bekannte
splice()
-Methode verwendet.
Zum Beispiel löschen wir hier 3 Elemente des Arrays ab Index 2, wonach wir zwei weitere Elemente an derselben Stelle hinzufügen:
const a = [1, 2, 3, 4, 5, 6] a.splice(2, 3, 'a', 'b') console.log(a)
▍Kombinieren Sie mehrere Arrays
Um mehrere Arrays zu kombinieren, können Sie die
concat()
-Methode verwenden, die ein neues Array zurückgibt.
const a = [1, 2] const b = [3, 4] const c = a.concat(b) console.log(c)
▍Finden Sie Elemente in einem Array
Im ES5-Standard wurde die Methode
indexOf()
, die den Index des ersten Auftretens des gewünschten Array-Elements zurückgibt. Wenn das Element nicht im Array gefunden werden kann, wird
-1
zurückgegeben.
const a = [1, 2, 3, 4, 5, 6, 7, 5, 8] console.log(a.indexOf(5))
Die
lastIndexOf()
-Methode gibt den Index des letzten Vorkommens des Elements im Array zurück oder
-1
wenn das Element nicht gefunden wird.
const a = [1, 2, 3, 4, 5, 6, 7, 5, 8] console.log(a.lastIndexOf(5))
In ES6 ist die Methode
find()
von Arrays erschienen, die eine Arraysuche mit der an sie übergebenen Funktion durchführt. Wenn die Funktion
true
zurückgibt, gibt die Methode den Wert des ersten gefundenen Elements zurück. Wenn das Element nicht gefunden werden kann, gibt die Funktion
undefined
.
Seine Verwendung kann wie folgt aussehen.
a.find(x => x.id === my_id)
Hier wird in einem Array mit Objekten nach einem Element gesucht, dessen
id
Eigenschaft der angegebenen entspricht.
Die
findIndex()
-Methode ähnelt
find()
, gibt jedoch den Index des gefundenen oder
undefined
Elements zurück.
In ES7 wurde die Methode include
includes()
angezeigt, mit der Sie überprüfen können, ob ein bestimmtes Element im Array vorhanden ist. Es gibt
true
oder
false
und findet oder findet kein Element, das für den Programmierer von Interesse ist.
a.includes(value)
Mit dieser Methode kann überprüft werden, ob ein Element vorhanden ist, nicht das gesamte Array, sondern nur ein Teil davon, beginnend mit dem Index, der beim Aufruf dieser Methode angegeben wurde. Der Index wird mit dem zweiten optionalen Parameter dieser Methode angegeben.
a.includes(value, i)
▍Ein Fragment eines Arrays abrufen
Um eine Kopie eines Fragments des Arrays als neues Array zu erhalten, können Sie die Methode
slice()
verwenden. Wenn diese Methode ohne Argumente aufgerufen wird, ist das zurückgegebene Array eine vollständige Kopie des Originals. Es werden zwei optionale Parameter benötigt. Der erste setzt den Startindex des Fragments, der zweite das Ende. Wenn der Endindex nicht angegeben ist, wird das Array vom angegebenen Startindex zum Ende kopiert.
const a = [1, 2, 3, 4, 5, 6, 7, 8, 9] console.log(a.slice(4))
Array Array sortieren
Um die Sortierung von Array-Elementen in alphabetischer Reihenfolge (
0-9A-Za-z
) zu organisieren, wird die Methode
sort()
verwendet, ohne dass Argumente an sie übergeben werden.
const a = [1, 2, 3, 10, 11] a.sort() console.log(a)
Sie können dieser Methode eine Funktion übergeben, die die Sortierreihenfolge festlegt. Die Funktion akzeptiert zum Vergleich zweier Elemente die Parameter
a
und
b
. Es gibt eine negative Zahl zurück, wenn
b
nach einem Kriterium kleiner als
b
ist, 0, wenn sie gleich sind, und eine positive Zahl, wenn
a
größer als
b
. Wenn Sie eine ähnliche Funktion zum Sortieren numerischer Arrays schreiben, kann das Ergebnis der Subtraktion von
a
und
b
. Wenn Sie also das Ergebnis der Auswertung des Ausdrucks
a - b
, wird das Array in aufsteigender Reihenfolge sortiert. Wenn Sie das Ergebnis der Auswertung des Ausdrucks
b - a
wird das Array in absteigender Reihenfolge sortiert.
const a = [1, 10, 3, 2, 11] console.log(a.sort((a, b) => a - b))
Um die Reihenfolge der Array-Elemente
reverse()
, können Sie die
reverse()
-Methode verwenden. Es ändert wie
sort()
das Array, für das es aufgerufen wird.
▍Erhalten einer Zeichenfolgendarstellung eines Arrays
Um eine Zeichenfolgendarstellung eines Arrays zu erhalten, können Sie die
toString()
-Methode verwenden.
a.toString()
Ein ähnliches Ergebnis liefert die Methode
join()
, die ohne Argumente aufgerufen wird.
a.join()
Als Argument können Sie die Trennelemente übergeben.
const a = [1, 10, 3, 2, 11] console.log(a.toString())
▍Erstellen von Kopien von Arrays
Um eine Kopie des Arrays zu erstellen, indem Sie die Werte des ursprünglichen Arrays in das neue Array kopieren, können Sie die Methode
Array.from()
verwenden. Es eignet sich auch zum Erstellen von Arrays aus Array-ähnlichen Objekten (z. B. aus Zeichenfolgen).
const a = 'a string' const b = Array.from(a) console.log(b)
Die
Array.of()
-Methode kann auch zum Kopieren von Arrays sowie zum „Zusammenstellen“ von Arrays aus verschiedenen Elementen verwendet werden. Um beispielsweise die Elemente eines Arrays in ein anderes zu kopieren, können Sie die folgende Konstruktion verwenden.
const a = [1, 10, 3, 2, 11] const b = Array.of(...a) console.log(b)
Die
copyWithin()
-Methode wird verwendet, um die Elemente des Arrays an eine bestimmte Stelle dieses Arrays selbst zu kopieren. Das erste Argument gibt den Anfangsindex der Zielposition an, das zweite den Anfangsindex der Position der Elementquelle und der dritte optionale Parameter den Endindex der Position der Elementquelle. Wenn Sie es nicht angeben, wird alles an den angegebenen Speicherort des Arrays kopiert, beginnend mit dem Anfangsindex der Quellposition bis zum Ende des Arrays.
const a = [1, 2, 3, 4, 5] a.copyWithin(0, 2) console.log(a)
Zyklen
Wenn wir oben über Arrays sprechen, haben wir bereits einige Möglichkeiten zum Organisieren von Schleifen gefunden. Schleifen in JavaScript werden jedoch nicht nur für die Arbeit mit Arrays verwendet, und wir haben weit davon entfernt, alle ihre Typen zu verwenden. Daher werden wir jetzt einige Zeit darauf verwenden, verschiedene Möglichkeiten zum Organisieren von Schleifen in JavaScript zu diskutieren und über deren Funktionen zu sprechen.
▍ für Schleife
Betrachten Sie ein Beispiel für die Anwendung dieses Zyklus.
const list = ['a', 'b', 'c'] for (let i = 0; i < list.length; i++) { console.log(list[i])
Wie bereits erwähnt, können Sie die Ausführung einer solchen Schleife mit dem Befehl
break
unterbrechen, die aktuelle Iteration überspringen und mit dem Befehl
continue
direkt zur nächsten wechseln.
▍ für jeden Zyklus
Wir haben auch diesen Zyklus besprochen. Hier ist ein Beispiel für die Iteration über ein Array, das es verwendet.
const list = ['a', 'b', 'c'] list.forEach((item, index) => { console.log(item)
Denken Sie daran, dass zum Unterbrechen eines solchen Zyklus eine Ausnahme ausgelöst werden muss. Wenn Sie diese bei Verwendung eines Zyklus unterbrechen müssen, ist es besser, einen anderen Zyklus zu wählen.
▍ Do ... while-Schleife
Dies ist der sogenannte "Nachbedingungszyklus". Eine solche Schleife wird mindestens einmal ausgeführt, bevor die Bedingung zum Beenden der Schleife überprüft wird.
const list = ['a', 'b', 'c'] let i = 0 do { console.log(list[i])
Es kann mit dem Befehl
break
unterbrochen werden. Mit dem Befehl
continue
können Sie mit der nächsten Iteration
continue
.
▍ while-Schleife
Dies ist der sogenannte „vorkonditionierte Zyklus“. Wenn am Eingang des Zyklus die Bedingung für die Fortsetzung des Zyklus falsch ist, wird sie nicht einmal ausgeführt.
const list = ['a', 'b', 'c'] let i = 0 while (i < list.length) { console.log(list[i])
▍ für ... in Schleife
Mit dieser Schleife können Sie alle aufgezählten Eigenschaften eines Objekts anhand ihrer Namen durchlaufen.
let object = {a: 1, b: 2, c: 'three'} for (let property in object) { console.log(property)
▍ Zyklus für ... von
Der
for...of
Zyklus kombiniert den Komfort des
forEach
Zyklus und die Fähigkeit, seinen Betrieb mit normalen Werkzeugen zu unterbrechen.
Beachten Sie, dass hier im Loop-Header das Schlüsselwort
const
verwendet wird und nicht, wie zu erwarten,
let
. Wenn die Variablen innerhalb des Schleifenblocks nicht neu zugewiesen werden müssen, ist
const
für uns durchaus geeignet.
Wenn wir die
for...in
und
for...of
Schleifen vergleichen, stellt sich heraus, dass
for...in
über die Namen der Eigenschaften und
for...of
- Werte der Eigenschaften iteriert.
Schleifen und Bereiche
Bei Schleifen und variablen Bereichen gibt es eine JavaScript-Funktion, die dem Entwickler einige Probleme bereiten kann. Um diese Probleme zu lösen, sprechen
let
über Schleifen, Bereiche und die Schlüsselwörter
var
und
let
.
Betrachten Sie ein Beispiel.
const operations = [] for (var i = 0; i < 5; i++) { operations.push(() => { console.log(i) }) } for (const operation of operations) { operation() }
Die Schleife führt 5 Iterationen durch, bei denen jeweils eine neue Funktion zum
operations
Array hinzugefügt wird. Diese Funktion zeigt in der Konsole den Wert des Schleifenzählers an -
i
. Nachdem die Funktionen zum Array hinzugefügt wurden, durchlaufen wir dieses Array und rufen die Funktionen auf, die seine Elemente sind.
Wenn Sie einen solchen Code ausführen, können Sie das unten gezeigte Ergebnis erwarten.
0 1 2 3 4
Tatsächlich schließt er jedoch Folgendes.
5 5 5 5 5
Warum ist das so? Die Sache ist, dass wir als Schleifenzähler eine Variable verwenden, die mit dem Schlüsselwort
var
deklariert wurde.
Da Deklarationen solcher Variablen bis zum oberen Rand des Bereichs reichen, ähnelt der obige Code dem folgenden.
var i; const operations = [] for (i = 0; i < 5; i++) { operations.push(() => { console.log(i) }) } for (const operation of operations) { operation() }
Als Ergebnis stellt sich heraus, dass in der
for...of
Schleife, in der wir über das Array iterieren, die Variable
i
immer noch sichtbar ist. Es ist 5, daher wird in allen Funktionen unter Bezugnahme auf
i
die Zahl 5 gedruckt.
Wie kann man das Verhalten des Programms so ändern, dass es das tut, was von ihm erwartet wird?
Die einfachste Lösung für dieses Problem ist die Verwendung des Schlüsselworts
let
. Es ist, wie bereits erwähnt, in ES6 erschienen. Durch seine Verwendung können Sie einige für
var
charakteristische Kuriositäten
var
.
Insbesondere im obigen Beispiel reicht es aus,
var
in
let
zu ändern
let
und alles wird so funktionieren, wie es sollte.
const operations = [] for (let i = 0; i < 5; i++) { operations.push(() => { console.log(i) }) } for (const operation of operations) { operation() }
Bei jeder Iteration der Schleife erhält jede dem
operations
Array hinzugefügte Funktion eine eigene Kopie von
i
. Denken Sie daran, dass Sie in dieser Situation das Schlüsselwort
const
nicht verwenden können, da sich der Wert von
i
in der Schleife ändert.
Eine andere Möglichkeit, dieses Problem zu lösen, das häufig vor dem ES6-Standard verwendet wurde, als das Schlüsselwort
let
nicht vorhanden war, war die Verwendung von IIFE.
Bei diesem Ansatz wird der Wert von
i
im Abschluss gespeichert, und die von IIFE zurückgegebene Funktion, die Zugriff auf den Abschluss hat, gelangt in das Array. Diese Funktion kann ausgeführt werden, wenn dies erforderlich wird. So sieht es aus.
const operations = [] for (var i = 0; i < 5; i++) { operations.push(((j) => { return () => console.log(j) })(i)) } for (const operation of operations) { operation() }
Zusammenfassung
Heute haben wir über Arrays und Loops in JavaScript gesprochen. Das Thema unseres nächsten Artikels ist die Ausnahmebehandlung, Semikolon-Verwendungsmuster und Vorlagenliterale.
Liebe Leser! Welche Methoden zum Arbeiten mit Arrays in JavaScript verwenden Sie am häufigsten?
