En C#, tenemosEnumerable.First(predicate) . Dado este código 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); } aparte de forEach , usando loop, usando múltiples o operadores o llamando implícitamente a some(predicate) , ¿hay una forma más inteligente de encontrar firstMatch ? Preferiblemente, una función de JavaScript (algo así como filterFirst(pedicate) ) que provoca un cortocircuito en la primera coincidencia que se asemeja a la implementación Enumerable.First() de C#.
FWIW, estoy apuntando a los tiempos de ejecución de node.js / io.js.
No es necesario reinventar la rueda, la forma correcta de hacerlo es usar .find :
var firstMatch = ['a', 'b', 'c'].find(applyConditions); Si está utilizando un navegador que no es compatible .find , puede polillenarlo
Los usuarios de LINQ llaman a first y firstOrDefault muchas veces sin predicado, lo que no es posible con find . Asi que,
first() { var firstOrDefault = this.firstOrDefault(); if(firstOrDefault !== undefined) return firstOrDefault; else throw new Error('No element satisfies the condition in predicate.'); } firstOrDefault() { return this.find(o => true); }Puede emular esto en el caso de que desee devolver el primer valor real con reduce .
['a', 'b', 'c'].reduce(function(prev, curr) { return prev || predicate(curr) && curr; }, false);editar: hecho más conciso con la sugerencia de @BenjaminGruenbaum