Wir präsentieren Ihnen eine Übersetzung eines Artikels von Thomas Lombart, der auf medium.freecodecamp.org veröffentlicht wurde. Die Übersetzung wird mit Genehmigung des Autors veröffentlicht.
Ein Beispiel für die Verwendung der Reduktionsmethode zum Reduzieren eines ArraysLassen Sie mich eine kühne Aussage machen: Schleifen sind oft nutzlos und machen das Lesen von Code schwierig. Für Iterationen in Arrays, Suchen, Sortieren von Elementen und andere ähnliche Aktionen können Sie eine der folgenden Methoden verwenden.
Trotz der Wirksamkeit sind die meisten dieser Methoden noch wenig bekannt und nicht sehr beliebt. Ich werde die harte Arbeit für Sie erledigen und über die nützlichsten sprechen. Lesen Sie diesen Artikel als Leitfaden für JavaScript-Array-Methoden.
Hinweis : Bevor wir beginnen, müssen Sie eines wissen: Ich bin voreingenommen gegenüber funktionaler Programmierung. Um Nebenwirkungen zu vermeiden, bemühe ich mich, Methoden anzuwenden, die das ursprüngliche Array nicht direkt ändern. Ich sage Ihnen nicht, dass Sie sich weigern sollen, das Array überhaupt zu ändern, aber es lohnt sich zu bedenken, dass einige Methoden dazu führen. Infolgedessen treten Nebenwirkungen, unerwünschte Änderungen und infolgedessen Fehler auf.
Dieser Artikel wurde ursprünglich auf
thomlom.dev veröffentlicht , wo Sie mehr Webentwicklungsmaterial finden.
Die Grundlagen
Es gibt vier Methoden, die Sie kennen sollten, wenn Sie mit Arrays arbeiten. Dies sind
map
,
filter
,
reduce
und der
spread
Operator. Sie sind effektiv und nützlich.
KarteSie werden häufig die
map
verwenden. Im Allgemeinen sollten Sie diese Option jedes Mal in Betracht ziehen, wenn Sie die Elemente eines Arrays ändern müssen.
Es wird ein Parameter benötigt - eine Funktion, die für jedes Element des Arrays aufgerufen wird und dann ein
neues Array zurückgibt, damit keine Nebenwirkungen auftreten können.
const numbers = [1, 2, 3, 4] const numbersPlusOne = numbers.map(n => n + 1) console.log(numbersPlusOne)
Sie können auch ein neues Array erstellen, in dem nur eine bestimmte Eigenschaft des Objekts gespeichert ist.
const allActivities = [ { title: 'My activity', coordinates: [50.123, 3.291] }, { title: 'Another activity', coordinates: [1.238, 4.292] } ] const allCoordinates = allActivities.map(activity => activity.coordinates) console.log(allCoordinates)
Denken Sie also daran: Wenn Sie
ein Array
ändern müssen , denken Sie an die Verwendung von
map .
FilterDer Name dieser Methode spricht für sich: Verwenden Sie ihn, wenn Sie ein Array filtern möchten.
Wie
map
filter
als einzelnen Parameter eine Funktion, die für jedes Element des Arrays aufgerufen wird. Diese Funktion sollte einen booleschen Wert zurückgeben:
true
- wenn Sie das Element in einem Array speichern möchten;false
- wenn Sie es nicht speichern möchten.
Als Ergebnis haben Sie das richtige neue Array mit den Elementen, die Sie verlassen möchten.
Beispielsweise können nur ungerade Zahlen in einem Array gespeichert werden.
const numbers = [1, 2, 3, 4, 5, 6] const oddNumbers = numbers.filter(n => n % 2 !== 0) console.log(oddNumbers)
Sie können auch Filter verwenden, um ein bestimmtes Element im Array zu entfernen.
const participants = [ { id: 'a3f47', username: 'john' }, { id: 'fek28', username: 'mary' }, { id: 'n3j44', username: 'sam' }, ] function removeParticipant(participants, id) { return participants.filter(participant => participant.id !== id) } console.log(removeParticipant(participants, 'a3f47'))
reduzierenMeiner Meinung nach ist diese Methode am schwierigsten zu verstehen. Aber sobald Sie es beherrschen, haben Sie eine Reihe von Möglichkeiten.
In der Regel verwendet die
reduce
ein Array von Werten und verkettet sie zu einem einzigen Wert. Es werden zwei Parameter benötigt, eine Rückruffunktion (die den
Reduzierer darstellt ) und einen optionalen Anfangswert (der standardmäßig das erste Element des Arrays ist). Das Getriebe selbst akzeptiert vier Parameter:
- eine Batterie, die die zurückgegebenen Werte im Getriebe sammelt;
- aktueller Wert des Arrays;
- aktueller Index;
- das Array, für das die
reduce
aufgerufen wurde.
Grundsätzlich verwenden Sie nur die ersten beiden Parameter - die Batterie und den aktuellen Wert.
Aber gehen wir nicht tief in die Theorie ein und betrachten das häufigste Beispiel für die Anwendung von
reduce
.
const numbers = [37, 12, 28, 4, 9] const total = numbers.reduce((total, n) => total + n) console.log(total)
In der ersten Iteration nimmt der Akkumulator, der die Summe ist, den Anfangswert 37 an. Der zurückgegebene Wert ist 37 + n, wobei n = 12. Wir erhalten 49.
Während der zweiten Iteration ist der Akkumulator 49, der zurückgegebene Wert ist 49 + 28 = 77. Und so weiter.
Die
reduce
ist so funktional, dass Sie damit viele Array-Methoden wie
map
oder
filter
erstellen können.
const map = (arr, fn) => { return arr.reduce((mappedArr, element) => { return [...mappedArr, fn(element)] }, []) } console.log(map([1, 2, 3, 4], n => n + 1))
In der Regel weisen wir der
reduce
- dem Akkumulator - den Anfangswert
[]
zu. Für die
map
wir eine Funktion aus, deren Ergebnis mit
dem Spread-Operator am Ende der Batterie hinzugefügt wird (wir werden weiter unten darauf eingehen, keine Sorge). Für
filter
fast dasselbe, wir führen nur die Filterfunktion für das Element aus. Wenn es wahr ist, geben wir das
vorherige Array zurück. Andernfalls fügen Sie das Element am Ende des Arrays hinzu.
Schauen wir uns ein komplexeres Beispiel an: Reduzieren Sie das Array
[1, 2, 3, [4, [[[5, [6, 7]]]], 8]]
auf
[1, 2, 3, 4, 5, 6, 7, 8]
.
function flatDeep(arr) { return arr.reduce((flattenArray, element) => { return Array.isArray(element) ? [...flattenArray, ...flatDeep(element)] : [...flattenArray, element] }, []) } console.log(flatDeep([1, 2, 3, [4, [[[5, [6, 7]]]], 8]]))
Dieses Beispiel ist der
map
sehr ähnlich, außer dass wir hier die Rekursion verwenden. Ich werde nicht im Detail auf die Rekursion eingehen, da dies den Rahmen unseres Themas sprengt. Wenn Sie jedoch mehr wissen möchten, gehen Sie zu dieser
hervorragenden Ressource .
Spread Statement (ES2015)Ich stimme zu, dies ist keine Methode. Der Spread-Operator hilft jedoch dabei, beim Arbeiten mit Arrays unterschiedliche Ziele zu erreichen. Sie können es anwenden, um die Werte eines Arrays in einem anderen zu erweitern und dann eine Kopie zu erstellen oder mehrere Arrays miteinander zu verknüpfen.
const numbers = [1, 2, 3] const numbersCopy = [...numbers] console.log(numbersCopy)
Hinweis : Die Spread-Anweisung erstellt eine
flache Kopie des ursprünglichen Arrays. Aber was bedeutet "oberflächlich"?
Durch eine solche Kopie werden die Originalelemente so wenig wie möglich dupliziert. Wenn Sie ein Array mit Zahlen, Zeichenfolgen oder booleschen Werten (
primitiven Typen ) haben, gibt es keine Probleme und die Werte sind wirklich dupliziert. Bei
Objekten und
Arrays sieht es jedoch anders aus: Es wird nur ein
Verweis auf den ursprünglichen Wert kopiert. Wenn Sie daher eine flache Kopie des Arrays einschließlich des Objekts erstellen und das Objekt im kopierten Array ändern, wird es auch im Original geändert, da sie
dieselbe Referenz haben .
const arr = ['foo', 42, { name: 'Thomas' }] let copy = [...arr] copy[0] = 'bar' console.log(arr)
Wenn Sie also eine echte Kopie eines Arrays erstellen möchten, das ein Objekt oder Arrays enthält, können Sie eine lodash-Funktion wie
cloneDeep verwenden . Aber halten Sie sich nicht dazu verpflichtet. Ihr Ziel ist es
herauszufinden, wie alles unter der Haube funktioniert .
Nützliche Methoden
Im Folgenden finden Sie weitere Methoden, die ebenfalls hilfreich sind und zur Lösung von Problemen wie dem Auffinden eines Elements in einem Array, dem Entfernen eines Teils eines Arrays und vielem mehr hilfreich sein können.
beinhaltet (ES2015)Haben Sie jemals
indexOf
, um herauszufinden, ob ein Array ein Element enthält oder nicht? Eine schreckliche Art zu überprüfen, oder?
Glücklicherweise übernimmt die
includes
Methode die Validierung für uns. Wenn Sie den Parameter für Includes festlegen, wird nach dem Element im Array gesucht.
const sports = ['football', 'archery', 'judo'] const hasFootball = sports.includes('football') console.log(hasFootball)
concatDie concat-Methode kann verwendet werden, um zwei oder mehr Arrays zusammenzuführen.
const numbers = [1, 2, 3] const otherNumbers = [4, 5, 6] const numbersConcatenated = numbers.concat(otherNumbers) console.log(numbersConcatenated)
für jedenWenn Sie für jedes Element des Arrays eine Aktion ausführen möchten, können Sie die
forEach
Methode verwenden. Es nimmt eine Funktion als Parameter an, die wiederum drei Parameter akzeptiert: aktueller Wert, Index und Array.
const numbers = [1, 2, 3, 4, 5] numbers.forEach(console.log)
indexOfDiese Methode wird verwendet, um den ersten Index zurückzugeben, an dem sich das Element im Array befindet. Außerdem prüft
indexOf
häufig,
indexOf
ein Element in einem Array vorhanden ist. Ehrlich gesagt, jetzt benutze ich es selten.
const sports = ['football', 'archery', 'judo'] const judoIndex = sports.indexOf('judo') console.log(judoIndex)
findenDie
find
ähnelt der
filter
. Sie müssen eine Funktion bereitstellen, mit der jedes Element des Arrays getestet wird.
find
stoppt jedoch das Testen von Elementen, sobald es eines findet, das den Test bestanden hat. Dies ist
kein filter
, der unabhängig von den Umständen über das gesamte Array iteriert.
const users = [ { id: 'af35', name: 'john' }, { id: '6gbe', name: 'mary' }, { id: '932j', name: 'gary' }, ] const user = users.find(user => user.id === '6gbe') console.log(user)
Verwenden Sie daher die
filter
, wenn Sie das
gesamte Array filtern möchten, und die
find
, wenn Sie sicher sind, dass Sie nach einem
eindeutigen Element im Array suchen.
findIndexDiese Methode ist fast identisch mit
find
, gibt jedoch den Index des ersten gefundenen Elements anstelle des Elements selbst zurück.
const users = [ { id: 'af35', name: 'john' }, { id: '6gbe', name: 'mary' }, { id: '932j', name: 'gary' }, ] const user = users.findIndex(user => user.id === '6gbe') console.log(user)
Sie könnten denken, dass
findIndex
und
indexOf
sind. Nicht wirklich. Der erste Parameter von
indexOf
ist ein primitiver Wert (ein boolescher Wert, eine Zahl, eine Zeichenfolge, ein undefinierter Wert oder ein Zeichen), während der erste Parameter,
findIndex
eine Rückruffunktion ist.
Wenn Sie den Index eines Elements in einem Array primitiver Werte
indexOf
, können Sie daher mit
indexOf
. Wenn Sie komplexere Elemente wie Objekte haben, verwenden Sie
findIndex
.
ScheibeWenn Sie an einem Array teilnehmen oder ein Array kopieren müssen, können Sie auf die
slice
Methode verweisen. Aber seien Sie vorsichtig: Wie der Spread-Operator gibt
slice
eine
flache Kopie zurück .
const numbers = [1, 2, 3, 4, 5] const copy = numbers.slice()
Am Anfang des Artikels erwähnte ich, dass Schleifen oft nutzlos sind. Lassen Sie mich Ihnen zeigen, wie Sie sie loswerden können.
Angenommen, Sie möchten eine bestimmte Anzahl von Chat-Nachrichten von der API zurückgeben und müssen nur fünf davon sehen. Im Folgenden sind zwei Ansätze aufgeführt: einer mit Schleifen, der andere mit der
slice
Methode.
einigeWenn Sie überprüfen möchten, ob
mindestens ein Element des Arrays den Test besteht, können Sie
some
. Wie beim
map
,
filter
oder
find
die Methode
some
eine Rückruffunktion als einzigen Parameter und gibt dann
true
zurück
true
wenn mindestens ein Element die Prüfung besteht, und
false
wenn nicht.
some
eignen sich auch zum Arbeiten mit Berechtigungen.
const users = [ { id: 'fe34', permissions: ['read', 'write'], }, { id: 'a198', permissions: [], }, { id: '18aa', permissions: ['delete', 'read', 'write'], } ] const hasDeletePermission = users.some(user => user.permissions.includes('delete') ) console.log(hasDeletePermission)
jederDiese Methode ähnelt
some
, außer dass überprüft wird, ob
jedes Element (und
nicht eines ) der Bedingung entspricht.
const users = [ { id: 'fe34', permissions: ['read', 'write'], }, { id: 'a198', permissions: [], }, { id: '18aa', permissions: ['delete', 'read', 'write'], } ] const hasAllReadPermission = users.every(user => user.permissions.includes('read') ) console.log(hasAllReadPermission)
flach (ES2019)Dies sind völlig neue Methoden in der JavaScript-Welt. Normalerweise erstellt
flat
ein neues Array, das alle Elemente eines verschachtelten Arrays verbindet. Es wird ein Parameter benötigt - eine Zahl, die angibt, um wie viel Sie die Dimension des Arrays reduzieren möchten.
const numbers = [1, 2, [3, 4, [5, [6, 7]], [[[[8]]]]]] const numbersflattenOnce = numbers.flat() console.log(numbersflattenOnce)
flatMap (ES2019)Ratet mal, was diese Methode macht? Ich wette, Sie werden einen Namen verstehen.
Zuerst wird die Zuordnungsfunktion für jedes Element ausgeführt und dann das Array gleichzeitig verkleinert. So einfach ist das!
const sentences = [ 'This is a sentence', 'This is another sentence', "I can't find any original phrases", ] const allWords = sentences.flatMap(sentence => sentence.split(' ')) console.log(allWords)
In diesem Beispiel haben Sie viele Sätze im Array und möchten alle Wörter erhalten. Anstatt die
flatMap
verwenden und alle Sätze in Wörter zu unterteilen und dann das Array zu verkürzen, können Sie
flatMap
.
Dann können Sie die Anzahl der Wörter mit der
reduce
(dies gilt nicht für
flatMap
, ich möchte Ihnen nur ein weiteres Beispiel für die Verwendung der
reduce
).
const wordsCount = allWords.reduce((count, word) => { count[word] = count[word] ? count[word] + 1 : 1 return count }, {}) console.log(wordsCount)
Die
flatMap
Methode
flatMap
auch häufig in der reaktiven Programmierung verwendet. Hier sehen Sie ein Beispiel.
beitretenWenn Sie eine Zeichenfolge basierend auf Array-Elementen erstellen müssen, benötigen Sie die
join
Methode. Sie können eine neue Linie erstellen, indem Sie alle Elemente des Arrays verbinden, die durch das bereitgestellte Trennzeichen getrennt sind.
Mit
join
Sie beispielsweise alle Teilnehmer einer Aktivität visuell anzeigen.
const participants = ['john', 'mary', 'gary'] const participantsFormatted = participants.join(', ') console.log(participantsFormatted)
Dies ist ein realistischeres Beispiel, bei dem Sie zuerst die Teilnehmer filtern und ihre Namen abrufen können.
const potentialParticipants = [ { id: 'k38i', name: 'john', age: 17 }, { id: 'baf3', name: 'mary', age: 13 }, { id: 'a111', name: 'gary', age: 24 }, { id: 'fx34', name: 'emma', age: 34 }, ] const participantsFormatted = potentialParticipants .filter(user => user.age > 18) .map(user => user.name) .join(', ') console.log(participantsFormatted)
vonDies ist eine
statische Methode, die ein neues Array aus einem Array-ähnlichen oder iterierbaren Objekt wie einer Zeichenfolge erstellt. Dies kann nützlich sein, wenn Sie mit dem Dokumentobjektmodell arbeiten.
const nodes = document.querySelectorAll('.todo-item')
Haben Sie gesehen, dass wir einen Array-Typ anstelle einer Array-Instanz verwendet haben? Deshalb wird diese Methode als statisch bezeichnet.
Dann können Sie Spaß mit den Knoten haben, indem Sie beispielsweise Ereignis-Listener für jeden von ihnen mit der
forEach
Methode registrieren.
todoItems.forEach(item => { item.addEventListener('click', function() { alert(`You clicked on ${item.innerHTML}`) }) })
Array-Modifikation, über die man Bescheid wissen sollte
Das Folgende sind andere Standardmethoden. Ihr Unterschied besteht darin, dass sie das ursprüngliche Array ändern. An der Änderung ist nichts auszusetzen, aber Sie sollten dies bei der Arbeit berücksichtigen.
Wenn Sie das ursprüngliche Array während der Arbeit mit diesen Methoden nicht ändern möchten, erstellen Sie im Voraus eine Oberfläche oder eine vollständige Kopie.
const arr = [1, 2, 3, 4, 5] const copy = [...arr]
sortierenJa,
sort
ändert das ursprüngliche Array. Tatsächlich werden die Elemente des Arrays an Ort und Stelle sortiert. Die Standardsortiermethode wandelt alle Elemente in Zeichenfolgen um und sortiert sie in alphabetischer Reihenfolge.
const names = ['john', 'mary', 'gary', 'anna'] names.sort() console.log(names)
Seien Sie vorsichtig: Wenn Sie beispielsweise von der Python-Sprache gewechselt haben, führt die
sort
beim Arbeiten mit einem Array von Zahlen nicht zum gewünschten Ergebnis.
const numbers = [23, 12, 17, 187, 3, 90] numbers.sort() console.log(numbers)
Wie sortiere ich dann ein Array? Die
sort
hat eine Funktion -
eine Vergleichsfunktion . Es werden zwei Parameter benötigt: das erste Element (
) und das zweite Element zum Vergleich (
b
). Der Vergleich zwischen diesen beiden Elementen erfordert eine Ziffernrückgabe:
- wenn der Wert negativ ist -
a
vor b
sortiert; - Wenn der Wert positiv ist, wird
b
vor a
sortiert. - Wenn der Wert 0 ist, keine Änderung.
Dann können Sie die Zahlen sortieren.
const numbers = [23, 12, 17, 187, 3, 90] numbers.sort((a, b) => a - b) console.log(numbers)
Oder Sie können die Daten nach den neuesten sortieren.
const posts = [ { title: 'Create a Discord bot under 15 minutes', date: new Date(2018, 11, 26), }, { title: 'How to get better at writing CSS', date: new Date(2018, 06, 17) }, { title: 'JavaScript arrays', date: new Date() }, ] posts.sort((a, b) => a.date - b.date)
füllenDie
fill
ändert oder füllt alle Elemente des Arrays vom Startindex bis zum Ende mit dem angegebenen Wert. Ein Beispiel für die hervorragende Verwendung von
fill
ist das Füllen eines neuen Arrays mit Anfangsdaten.
umgekehrtEs scheint mir, dass der Name der Methode ihre Essenz vollständig erklärt.
const numbers = [1, 2, 3, 4, 5] numbers.reverse() console.log(numbers)
PopDiese Methode entfernt das letzte Element aus dem Array und gibt es zurück.
const messages = ['Hello', 'Hey', 'How are you?', "I'm fine"] const lastMessage = messages.pop() console.log(messages)
Methoden, die ersetzt werden können
Im letzten Abschnitt finden Sie Methoden, die das ursprüngliche Array ändern und die leicht zu finden sind. Ich sage nicht, dass sie abgezinst werden müssen, ich möchte Ihnen nur vermitteln, dass einige Methoden Nebenwirkungen haben und ersetzt werden können.
drückenDiese Methode wird häufig verwendet. Sie können dem Array ein oder mehrere Elemente hinzufügen und ein neues Array basierend auf dem vorherigen erstellen.
const todoItems = [1, 2, 3, 4, 5] const itemsIncremented = [] for (let i = 0; i < items.length; i++) { itemsIncremented.push(items[i] + 1) } console.log(itemsIncremented)
Wenn Sie ein Array auf der Basis eines anderen Arrays
itemsIncremented
, wie bei der Methode
itemsIncremented
, gibt es geeignete
map
,
filter
oder
reduce
, die uns bereits bekannt sind. Zum Beispiel können wir dazu eine
map
nehmen.
const itemsIncremented = todoItems.map(x => x + 1)
Und wenn Sie
push
möchten
push
wenn Sie ein neues Element hinzufügen müssen, ist der Spread-Operator hilfreich.
const todos = ['Write an article', 'Proofreading'] console.log([...todos, 'Publish the article'])
Spleißensplice
häufig zugegriffen, um ein Element an einem bestimmten Index zu bereinigen. Sie können dasselbe mit der
filter
tun.
const months = ['January', 'February', 'March', 'April', ' May']
Sie fragen sich vielleicht: Was ist, wenn ich viele Elemente entfernen muss? Dann
slice
.
const months = ['January', 'February', 'March', 'April', ' May']
verschiebenDie
shift
Methode entfernt das erste Element des Arrays und gibt es zurück. Um dies im Stil der funktionalen Programmierung zu tun, können Sie die Anweisungpread oder rest verwenden.
const numbers = [1, 2, 3, 4, 5]
verschiebenMit der Methode zum Verschieben können Sie ein oder mehrere Elemente am Anfang eines Arrays hinzufügen. Wie bei
shift
können Sie dies mit dem Spread-Operator tun.
const numbers = [3, 4, 5]
TL; DR
- Wenn Sie einige Operationen mit einem Array ausführen möchten, verwenden Sie nicht die for-Schleife und erfinden Sie das Rad nicht neu, da es höchstwahrscheinlich eine der oben genannten Methoden gibt, die das tun kann, was Sie benötigen.
- Am häufigsten verwenden Sie die
map
, filter
, reduce
Methoden und den Spread-Operator - dies sind wichtige Tools für jeden Entwickler. - Es gibt auch viele Array-Methoden, die gut zu wissen wären:
slice
, some
, flatMap
usw. flatMap
Sie sie kennen und wenden Sie sie bei Bedarf an. - Nebenwirkungen können zu unerwünschten Veränderungen führen. Beachten Sie, dass einige Methoden Ihr ursprüngliches Array ändern.
- Die
slice
Methode und der Spread-Operator erstellen flache Kopien. Infolgedessen haben Objekte und Subarrays die gleichen Verknüpfungen - dies ist auch zu beachten. - Alte Methoden, die das Array ändern, können durch neue ersetzt werden. Sie entscheiden, was zu tun ist.
Jetzt wissen Sie alles, was Sie über JavaScript-Arrays wissen sollten. Wenn Ihnen
dieser Artikel gefallen
hat , klicken Sie auf die Schaltfläche "Pat" (bis zu 50 Mal, wenn Sie möchten :-)) und teilen Sie ihn. Und zögern Sie nicht, Ihre Eindrücke in den Kommentaren zu teilen!