Utilisation efficace des méthodes de tableau en JavaScript

L'auteur du matériel, dont nous publions la traduction aujourd'hui, dit qu'au cours des derniers mois, lors de la vérification des demandes de tirage, il a constamment rencontré les quatre mêmes lacunes associées à l'utilisation irrationnelle des méthodes de tableau en JavaScript. Afin de réduire ces défauts de code qui apparaissaient auparavant dans ses programmes, il a écrit cet article.



Remplacement de indexOf () par includes ()


"Si vous recherchez quelque chose dans un tableau, utilisez la méthode indexOf() ." J'ai rencontré une telle recommandation dans l'un des cours lorsque j'ai étudié JavaScript. Cette recommandation est tout à fait normale, on ne peut rien en dire de mal.

Sur MDN, vous pouvez découvrir que la méthode indexOf() renvoie le premier index par lequel un certain élément peut être trouvé dans le tableau. Cela signifie que si nous prévoyons d'utiliser cet index dans le programme, la méthode indexof() est idéale pour trouver des éléments dans des tableaux.

Mais que faire si nous avons juste besoin de savoir s'il y a un certain élément dans le tableau ou non? Autrement dit, nous ne nous intéressons pas à l'index de cet élément, s'il se trouve dans le tableau, mais au fait de sa présence ou de son absence. Avec cette approche, nous sommes assez à l'aise avec une commande qui renvoie true ou false . Dans de tels cas, je recommande de ne pas utiliser la méthode indexOf() , mais la méthode includes() , qui renvoie une valeur booléenne. Prenons un exemple:

 '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 

Utilisation de la méthode find () au lieu de la méthode filter ()


La méthode filter() est un outil très utile. Il, sur la base d'un tableau, crée un autre tableau contenant les éléments du tableau d'origine qui correspondent à la condition spécifiée. Comme on peut le comprendre d'après le nom de cette méthode, elle est destinée au filtrage des tableaux, au cours desquels sont généralement obtenus des tableaux plus courts que les originaux.

Et si nous savons qu'après avoir filtré le tableau, il ne restera qu'un élément? Par exemple, cela peut se produire lorsque vous essayez de filtrer les éléments d'un tableau en fonction d'un identifiant unique. Dans une telle situation, je ne recommanderais pas d'utiliser la méthode filter() , car le tableau qu'il forme ne contiendra qu'un seul élément. Si nous sommes intéressés par un élément de tableau avec une valeur unique, alors nous allons travailler avec une seule valeur, et un tableau n'est pas nécessaire pour représenter une telle valeur.

Si nous parlons des performances de la méthode filter() , il s'avère que pour former une liste d'éléments correspondant à la condition spécifiée lors de son appel, il faudrait regarder l'ensemble du tableau. De plus, imaginez qu'il y a des centaines d'éléments dans un tableau qui satisfont une condition donnée. Cela se traduira par le tableau résultant étant assez grand.

Afin d'éviter d'entrer dans de telles situations, je recommanderais d'utiliser la méthode find() . Lorsqu'elle est appelée, elle reçoit un rappel décrivant la condition, très similaire à celle utilisée avec la méthode filter() , mais la méthode find() ne renvoie que le premier élément qui correspond à la condition. Dans le même temps, cette méthode cesse de fonctionner immédiatement après avoir trouvé un tel élément. Par conséquent, il n'a pas à parcourir l'intégralité du tableau.

 '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' } 

Remplacement de la méthode find () par la méthode some ()


Je dois admettre que la surveillance dont nous allons discuter maintenant, je l'ai engagée à plusieurs reprises. Ensuite, ils m'ont conseillé de regarder MDN et de voir comment améliorer ce que je faisais irrationnellement. En un mot, cela est très similaire à ce que nous venons de voir en parlant des indexOf() et includes() .

Dans le cas ci-dessus, nous avons vu que la méthode find() , comme argument, prend un rappel et retourne un élément de tableau. La méthode find() peut-elle être appelée la solution la plus efficace si nous devons savoir si le tableau contient une certaine valeur ou non? Peut-être pas, car cette méthode renvoie la valeur d'un élément de tableau, pas un booléen.

Dans une telle situation, je recommanderais d'utiliser la méthode some() , qui renvoie une valeur booléenne.

 '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 

Utilisation de la méthode Reduce () au lieu d'une combinaison de méthodes filter () et map ()


Il vaut la peine de dire que la méthode reduce() ne peut pas être classée comme facile à comprendre. Cependant, si ce qui peut être fait avec cela se fait en deux étapes, en utilisant les méthodes filter() et map() combinées dans une chaîne, il semble que quelque chose dans cette approche soit incorrect.

Je dis qu'avec cette approche, vous devez regarder le tableau deux fois. La première passe, effectuée par la méthode filter() , implique la visualisation de l'ensemble du tableau et la création d'un nouveau tableau filtré. Après la deuxième passe, effectuée par la méthode map() , encore une fois, un nouveau tableau est créé qui contient les résultats de la transformation des éléments du tableau obtenus après l'exécution de la méthode filter() . Par conséquent, pour atteindre le tableau fini, deux méthodes sont utilisées. Chaque méthode a son propre rappel, et pendant l'exécution d'une telle opération à l'aide de la méthode filter() , un tableau est créé avec lequel nous ne pouvons plus travailler.

Afin de réduire la charge sur le système créé en utilisant deux méthodes et d'augmenter la productivité des programmes, dans de tels cas, je recommanderais d'utiliser la méthode reduce() . Le résultat sera le même, mais le code sera meilleur. Cette méthode vous permet de filtrer les éléments qui nous intéressent et de les ajouter à la batterie. La batterie peut être une variable numérique qui stocke, disons, la somme des éléments du tableau, elle peut être un objet, une chaîne ou un tableau dans lequel nous pouvons accumuler les éléments dont nous avons besoin.

Dans notre cas, puisque nous parlons de l'utilisation de la méthode map() , je conseillerais d'utiliser la méthode reduce() avec un tableau comme accumulateur. Dans l'exemple suivant, nous filtrons les éléments du tableau qui sont des objets par la valeur du champ env et effectuons leur conversion.

 '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'] } // ] 

Résumé


Dans cet article, nous avons examiné certaines approches de l'utilisation efficace des méthodes de tableau pour résoudre divers problèmes. Nous pensons que les idées sur lesquelles les recommandations données par l'auteur de cet article sont basées peuvent aider à améliorer le code JS dans d'autres situations.

Chers lecteurs! Avez-vous déjà rencontré des exemples de mauvaise allocation des mécanismes JavaScript?

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


All Articles