在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运行时。
答案 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)
);
用户在没有谓词的情况下频繁调用LINQ
和first
,而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");
}
创建自己的抽象人员是可以的。