Différence entre find() et filter().shift () sur javascript

j'ai récemment commencé à laisser tomber underscore/lodash abuser de (certains) mes projets et réaliser qu'il n'y a pas de soutien total de trouver méthode dans les navigateurs. Quelle est la différence entre la méthode ES6 trouver et l'utilisation .maj() sur filtre résultats

var user = users.find(function() { ... } );

ou

var user = users.filter(function() { ... } ).shift();

j'imagine qu'il y a une optimisation évidente sur la méthode "find" (stop iterating on fist match), mais puis-je obtenir des résultats inattendus en utilisant la seconde approche? Dois-je utiliser le polyfill à la place? Pourquoi?

26
demandé sur Daniel A. White 2015-11-17 17:13:28

2 réponses

mis à part les frais généraux évidents (et perceptibles), Oui, les résultats peuvent varier. filter fonctionne jusqu'à la fin du tableau, et invoque son rappel sur chaque élément; en contraste avec find qui s'arrête après avoir trouvé un. Lorsque le callback lance une exception sur l'un de ces éléments itérés supplémentaires, le résultat est différent.

Je ne vois aucune bonne raison de ne pas utiliser find.

56
répondu Bergi 2015-11-17 14:35:09

un polyfill;users.filter(function() { ... } ).shift(); jette les cycles tout en déclenchant la collecte inutile des ordures.

  • filter scanne tout le tableau et crée un autre tableau
  • shift doit maintenant changer tous les indices sur le tableau temp

un schéma un peu moins gaspilleur serait d'utiliser users.filter(function() { ... } )[0]

10
répondu Juan Mendes 2015-11-18 12:09:12