Effektive Verwendung von Array-Methoden in JavaScript

Der Autor des Materials, dessen Übersetzung wir heute veröffentlichen, sagt, dass er in den letzten Monaten bei der Überprüfung von Pull-Anfragen ständig auf dieselben vier Mängel gestoßen ist, die mit der irrationalen Verwendung von Array-Methoden in JavaScript verbunden sind. Um solche Codefehler zu reduzieren, die zuvor in seinen Programmen auftraten, schrieb er diesen Artikel.



Ersetzen von indexOf () durch include ()


"Wenn Sie nach etwas in einem Array suchen, verwenden Sie die indexOf() -Methode." Ich habe eine solche Empfehlung in einem der Kurse getroffen, als ich JavaScript studiert habe. Diese Empfehlung ist ganz normal, nichts Schlechtes kann darüber gesagt werden.

In MDN können Sie feststellen, dass die indexOf() -Methode den ersten Index zurückgibt, anhand dessen ein bestimmtes Element im Array gefunden werden kann. Dies bedeutet, dass die indexof() -Methode hervorragend indexof() ist, um Elemente in Arrays zu finden, wenn wir diesen Index im Programm verwenden indexof() .

Aber was ist, wenn wir nur herausfinden müssen, ob das Array ein bestimmtes Element enthält oder nicht? Das heißt, wir interessieren uns nicht für den Index dieses Elements, wenn es sich im Array befindet, sondern für die Tatsache, dass es vorhanden oder nicht vorhanden ist. Mit diesem Ansatz sind wir mit einem Befehl sehr vertraut, der true oder false zurückgibt. In solchen Fällen empfehle ich, nicht die indexOf() -Methode zu verwenden, sondern die indexOf() includes() -Methode, die einen booleschen Wert zurückgibt. Betrachten Sie ein Beispiel:

 'use strict'; const characters = [ 'ironman', 'black_widow', 'hulk', 'captain_america', 'hulk', 'thor', ]; console.log(characters.indexOf('hulk')); // 2 console.log(characters.indexOf('batman')); // -1 console.log(characters.includes('hulk')); // true console.log(characters.includes('batman')); // false 

Verwenden Sie die find () -Methode anstelle der filter () -Methode


Die filter() -Methode ist ein sehr nützliches Werkzeug. Auf der Grundlage eines Arrays wird ein anderes Array erstellt, das die Elemente des ursprünglichen Arrays enthält, die der angegebenen Bedingung entsprechen. Wie aus dem Namen dieses Verfahrens ersichtlich ist, ist es zum Filtern von Arrays vorgesehen, bei denen üblicherweise Arrays erhalten werden, die kürzer als die ursprünglichen sind.

Was ist, wenn wir wissen, dass nach dem Filtern des Arrays nur ein Element übrig bleibt? Dies kann beispielsweise passieren, wenn Sie versuchen, Array-Elemente anhand einer eindeutigen Kennung zu filtern. In einer solchen Situation würde ich die Verwendung der filter() -Methode nicht empfehlen, da das Array, das sie bildet, nur ein Element enthält. Wenn wir an einem Array-Element mit einem eindeutigen Wert interessiert sind, arbeiten wir mit einem einzelnen Wert, und ein Array wird nicht benötigt, um einen solchen Wert darzustellen.

Wenn wir über die Leistung der filter() -Methode sprechen, stellt sich heraus, dass zum Erstellen einer Liste von Elementen, die der beim Aufruf angegebenen Bedingung entsprechen, das gesamte Array betrachtet werden muss. Stellen Sie sich außerdem vor, dass ein Array Hunderte von Elementen enthält, die eine bestimmte Bedingung erfüllen. Dies führt dazu, dass das resultierende Array ziemlich groß ist.

Um solche Situationen zu vermeiden, würde ich die Methode find() empfehlen. Beim Aufruf erhält es einen Rückruf, der die Bedingung beschreibt und der mit der filter() -Methode verwendeten sehr ähnlich ist. Die find() -Methode gibt jedoch nur das erste Element zurück, das der Bedingung entspricht. Gleichzeitig funktioniert diese Methode sofort nicht mehr, nachdem sie ein solches Element gefunden hat. Infolgedessen muss er nicht das gesamte Array durchsuchen.

 'use strict'; const characters = [ { id: 1, name: 'ironman' }, { id: 2, name: 'black_widow' }, { id: 3, name: 'captain_america' }, { id: 4, name: 'captain_america' }, ]; function getCharacter(name) { return character => character.name === name; } console.log(characters.filter(getCharacter('captain_america'))); // [ //   { id: 3, name: 'captain_america' }, //   { id: 4, name: 'captain_america' }, // ] console.log(characters.find(getCharacter('captain_america'))); // { id: 3, name: 'captain_america' } 

Ersetzen der find () -Methode durch die some () -Methode


Ich muss zugeben, das Versehen, über das wir jetzt sprechen werden, habe ich schon oft begangen. Dann rieten sie mir, mir MDN anzuschauen und herauszufinden, wie ich das, was ich irrational getan habe, verbessern kann. Kurz gesagt, dies ist sehr ähnlich zu dem, was wir uns gerade angesehen haben, als wir über die indexOf() und indexOf() includes() -Methoden gesprochen haben.

Im obigen Fall haben wir gesehen, dass die find() -Methode als Argument einen Rückruf akzeptiert und ein Array-Element zurückgibt. Kann die find() -Methode als die erfolgreichste Lösung bezeichnet werden, wenn wir herausfinden müssen, ob das Array einen bestimmten Wert enthält oder nicht? Möglicherweise nicht, da diese Methode den Wert eines Array-Elements und keinen Booleschen Wert zurückgibt.

In einer solchen Situation würde ich die Verwendung der some() -Methode empfehlen, die einen booleschen Wert zurückgibt.

 'use strict'; const characters = [ { id: 1, name: 'ironman', env: 'marvel' }, { id: 2, name: 'black_widow', env: 'marvel' }, { id: 3, name: 'wonder_woman', env: 'dc_comics' }, ]; function hasCharacterFrom(env) { return character => character.env === env; } console.log(characters.find(hasCharacterFrom('marvel'))); // { id: 1, name: 'ironman', env: 'marvel' } console.log(characters.some(hasCharacterFrom('marvel'))); // true 

Verwenden der Methode redu () anstelle einer Kombination der Methoden filter () und map ()


Es ist anzumerken, dass die Methode reduce() nicht als leicht verständlich eingestuft werden kann. Wenn jedoch das, was damit gemacht werden kann, in zwei Schritten unter Verwendung der in einer Kette kombinierten Methoden filter() und map() wird, scheint etwas in diesem Ansatz nicht zu stimmen.

Ich sage, dass Sie bei diesem Ansatz das Array zweimal betrachten müssen. Der erste Durchgang, der von der filter() -Methode ausgeführt wird, umfasst das Anzeigen des gesamten Arrays und das Erstellen eines neuen, gefilterten Arrays. Nach dem zweiten Durchgang, der von der map() -Methode ausgeführt wird, wird erneut ein neues Array erstellt, das die Ergebnisse der Transformation der Elemente des Arrays enthält, die nach dem Ausführen der filter() -Methode erhalten wurden. Um das fertige Array zu erreichen, werden daher zwei Methoden verwendet. Jede Methode hat ihren eigenen Rückruf, und während der Ausführung einer solchen Operation mit der filter() -Methode wird ein Array erstellt, mit dem wir nicht mehr arbeiten können.

In solchen Fällen würde ich die Verwendung der Methode reduce() empfehlen, um die Belastung des mit zwei Methoden erstellten Systems zu verringern und die Produktivität von Programmen zu steigern. Das Ergebnis wird das gleiche sein, aber der Code wird besser ausfallen. Mit dieser Methode können Sie die für uns interessanten Elemente filtern und zur Batterie hinzufügen. Die Batterie kann eine numerische Variable sein, die beispielsweise die Summe der Elemente des Arrays speichert. Sie kann ein Objekt, eine Zeichenfolge oder ein Array sein, in dem wir die benötigten Elemente akkumulieren können.

In unserem Fall würde ich, da es sich um die Verwendung der map() -Methode handelt, die Verwendung der reduce() -Methode mit einem Array als Akkumulator empfehlen. Im folgenden Beispiel filtern wir die Array-Elemente, die Objekte sind, nach dem Wert des env Felds und führen ihre Konvertierung durch.

 'use strict'; const characters = [ { name: 'ironman', env: 'marvel' }, { name: 'black_widow', env: 'marvel' }, { name: 'wonder_woman', env: 'dc_comics' }, ]; console.log( characters   .filter(character => character.env === 'marvel')   .map(character => Object.assign({}, character, { alsoSeenIn: ['Avengers'] })) ); // [ //   { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] }, //   { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] } // ] console.log( characters   .reduce((acc, character) => {     return character.env === 'marvel'       ? acc.concat(Object.assign({}, character, { alsoSeenIn: ['Avengers'] }))       : acc;   }, []) ) // [ //   { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] }, //   { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] } // ] 

Zusammenfassung


In diesem Artikel haben wir einige Ansätze zur effektiven Verwendung von Array-Methoden zur Lösung verschiedener Probleme untersucht. Wir glauben, dass die Ideen, auf denen die Empfehlungen des Autors dieses Artikels basieren, dazu beitragen können, den JS-Code in anderen Situationen zu verbessern.

Liebe Leser! Haben Sie jemals Beispiele für eine Fehlallokation von JavaScript-Mechanismen gefunden?

Source: https://habr.com/ru/post/de422091/


All Articles