web-dev-qa-db-ja.com

LINQ Enumerable.First(predicate)と同等

C#では、 Enumerable.First(predicate) があります。この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);
}
_

forEach以外の、ループを使用する、複数のor演算子を使用する、または暗黙的にsome(predicate)を呼び出す、firstMatchを見つけるよりスマートな方法はありますか?できれば、C#のfilterFirst(pedicate)実装に似た最初の一致で短絡するJavaScript関数(Enumerable.First()のようなもの)ですか?

FWIW、node.js/io.jsランタイムをターゲットにしています。

36
vulcan raven

車輪を作り直す必要はありません。正しい方法は .find を使用することです。

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

.findをサポートしていないブラウザを使用している場合、 polyfill it

53

reduceで最初のtruthy値を返す場合は、これをエミュレートできます。

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

編集: @BenjaminGruenbaumの提案により簡潔になりました

2
xzyfer