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 Arrays
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 reduceaufgerufen 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 - avorbsortiert;
- Wenn der Wert positiv ist, wird bvorasortiert.
- 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,reduceMethoden 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,flatMapusw.flatMapSie 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 sliceMethode 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!