Ответ 1
Не нужно изобретать колесо, правильный способ сделать это - использовать .find
:
var firstMatch = ['a', 'b', 'c'].find(applyConditions);
Если вы используете браузер, который не поддерживает .find
, вы можете polyfill it
В С# мы имеем 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 время выполнения.
Не нужно изобретать колесо, правильный способ сделать это - использовать .find
:
var firstMatch = ['a', 'b', 'c'].find(applyConditions);
Если вы используете браузер, который не поддерживает .find
, вы можете polyfill it
Вы можете эмулировать это в случае, когда вы хотите вернуть первое правное значение с помощью reduce
.
['a', 'b', 'c'].reduce(function(prev, curr) {
return prev || predicate(curr) && curr;
}, false);
edit: сделано более кратким с предложением @BenjaminGruenbaum
Извините, но это тривиально, как ад
function first(array, predicate) {
for (var i = 0; i < array.length; ++i) {
if (predicate(array[i])) return array[i];
}
throw new Error("no match");
}
Хорошо создавать собственные абстракции людей.