相当于LINQ的Enumberable.First(谓词)

vul*_*ven 39 javascript linq arrays filter node.js

在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);
}
Run Code Online (Sandbox Code Playgroud)

除了forEach使用循环,使用多个或运算符或隐式调用some(predicate),是否有更聪明的方法来查找firstMatch?优选地,JavaScript函数(类似的东西filterFirst(pedicate))在第一次匹配时短路,类似于C#的Enumerable.First()实现?

FWIW,我的目标是node.js/io.js运行时.

Ben*_*aum 58

无需重新发明轮子,正确的方法是使用.find:

var firstMatch = ['a', 'b', 'c'].find(applyConditions);
Run Code Online (Sandbox Code Playgroud)

如果您使用的是不支持的浏览器,则.find可以对其进行填充

  • 首先,如果没有任何匹配项,则在“c#”中会引发异常。因此,“find”相当于“FirstOrDefault”。 (4认同)

tod*_*dmo 7

LINQ用户在没有谓词的情况下调用firstand firstOrDefaulta lot,这是不可能的find。所以,

  first() {
    var firstOrDefault = this.firstOrDefault();
    if(firstOrDefault !== undefined)
      return firstOrDefault;
    else
      throw new Error('No element satisfies the condition in predicate.');
  }

  firstOrDefault() {
    return this.find(o => true);
  }
Run Code Online (Sandbox Code Playgroud)