web-dev-qa-db-fra.com

Équivalent à LINQ Enumerable.First (prédicat)

En C #, nous avons Enumerable.First(predicate) . Compte tenu de ce code JavaScript:

function process() {
  var firstMatch = ['a', 'b', 'c'].filter(function(e) {
    return applyConditions(e);
  }).shift();

  if(!firstMatch) {
    return;
  }

  // do something else
}

function applyConditions(element) {
  var min = 97;
  var max = 122;

  var random = Math.floor(Math.random() * (max - min + 1) + min);

  return element === String.fromCharCode(random);
}

autre que forEach, en utilisant une boucle, en utilisant plusieurs opérateurs ou ou en appelant implicitement some(predicate), existe-t-il un moyen plus intelligent de trouver le firstMatch? De préférence une fonction JavaScript (quelque chose comme filterFirst(pedicate)) qui court-circuite sur la première correspondance ressemblant à l'implémentation de Enumerable.First() de C #?

FWIW, je cible les runtimes node.js/io.js.

36
vulcan raven

Pas besoin de réinventer la roue, la bonne façon de le faire est d'utiliser .find :

var firstMatch = ['a', 'b', 'c'].find(applyConditions);

Si vous utilisez un navigateur qui ne prend pas en charge .find vous pouvez remplissez-le

53
Benjamin Gruenbaum

Vous pouvez émuler ceci dans le cas où vous souhaitez renvoyer la première vérité valeur avec reduce.

['a', 'b', 'c'].reduce(function(prev, curr) { 
    return prev || predicate(curr) && curr; 
}, false);

edit: rendu plus concis avec la suggestion @BenjaminGruenbaum

2
xzyfer