JavaScriptfilter首先等同于LINQ的Enumberable.First(谓词)
在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)
,有没有更聪明的方法来findfirstMatch
? 最好是一个类似于C#的Enumerable.First()
实现的JavaScript函数(类似filterFirst(pedicate)
),
FWIW,我的目标是node.js / io.js运行时。
不需要重新发明轮子,正确的方法是使用.find
:
var firstMatch = ['a', 'b', 'c'].find(applyConditions);
如果您使用的是不支持.find
的浏览器,则可以对其进行 .find
对不起,但这是微不足道的
function first(array, predicate) { for (var i = 0; i < array.length; ++i) { if (predicate(array[i])) return array[i]; } throw new Error("no match"); }
可以创build自己的抽象人。
你可以效仿这种情况下,你想返回第一truthy值与reduce
。
['a', 'b', 'c'].reduce(function(prev, curr) { return prev || predicate(curr) && curr; }, false);
编辑:使@BenjaminGruenbaumbuild议更简洁