Фильтр JavaScript сначала эквивалентен LINQ Enumnable. Первый (предикат)

В С# мы имеем 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)), которая коротко замыкается в первом совпадении, напоминающем реализацию С# Enumerable.First()?

FWIW, я нацелен на node.js/io.js время выполнения.

Ответы

Ответ 1

Не нужно изобретать колесо, правильный способ сделать это - использовать .find:

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

Если вы используете браузер, который не поддерживает .find, вы можете polyfill it

Ответ 2

Вы можете эмулировать это в случае, когда вы хотите вернуть первое правное значение с помощью reduce.

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

edit: сделано более кратким с предложением @BenjaminGruenbaum

Ответ 3

Извините, но это тривиально, как ад

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

Хорошо создавать собственные абстракции людей.