相当于LINQ Enumerable.First(谓词)

时间:2015-02-12 11:45:19

标签: javascript arrays node.js linq filter

在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以外,使用循环,使用多个或运算符或隐式调用some(predicate),是否有更智能的方法来查找firstMatch?优选地,JavaScript函数(类似filterFirst(pedicate))在首次匹配时短路,类似于C#的Enumerable.First()实现?

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

4 个答案:

答案 0 :(得分:49)

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

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

如果您使用的浏览器不支持.find,您可以polyfill it

答案 1 :(得分:2)

如果您希望使用reduce返回第一个 truthy 值,则可以模拟此情况。

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

编辑:@BenjaminGruenbaum建议更加简洁

答案 2 :(得分:0)

CREATE TABLE Persons ( Personid int NOT NULL AUTO_INCREMENT, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, PRIMARY KEY (Personid) ); 用户在没有谓词的情况下频繁调用LINQfirst,而firstOrDefault则不可能。因此,

find

答案 3 :(得分:-2)

很抱歉,但这很简单,因为地狱

function first(array, predicate) {
    for (var i = 0; i < array.length; ++i) {
        if (predicate(array[i])) return array[i];
    }
    throw new Error("no match");
}

创建自己的抽象人员是可以的。