tutorial principiantes para pagina node libro funcion ejemplos ejemplo ejecutar desde cero cargar carga asincrona antes javascript functional-programming coffeescript livescript

javascript - principiantes - ¿Qué es un reemplazo de estilo funcional para este ciclo?



node js desde cero pdf (6)

nums = [2 5 3 7] result = [] result.push {x:nums[0]} for n in nums.slice(1) result.push {n:n + result[-1].x} log result # [{x:2} {x:7} {x:10} {x:17}]

Esto es difícil de expresar funcionalmente usando el map funciones porque cada elemento depende del elemento anterior. ¿Cuál es la solución funcional correcta para este algoritmo?


La forma más simple que sé evita los cierres que afectan el rendimiento, las variables, la sobrecarga de la función adicional y los globales:

result= [2, 5, 3, 7].map(function(a){ return { x: this[0]+=a }; }, [0]);

JS proporciona el segundo parámetro .map () que rara vez se usa para almacenar cualquier estado que necesite entre iteraciones.

Probablemente no sea más simple que esto, pero no conozco el café, lo siento ...

EDITAR: creó una demostración en dos idiomas (js + cs): http://pagedemos.com/maptranforms/


Lo que está describiendo es un escaneo: un pliegue que también arroja resultados intermedios. Usando scan1 desde prelude.ls:

nums = [2 5 3 7] scan1 (+), nums |> map ((num) -> { x : num }) # => [{x: 2}, {x: 7}, {x: 10}, {x: 17}]

Si no necesita los objetos dentro de la matriz y solo necesita las adiciones con resultados intermedios, entonces puede soltar completamente la operación de mapa y simplemente escribir:

scan1 (+), [2 5 3 7] # => [2, 7, 10, 17]

scan1 .


Necesitas mantener alguna información de estado en alguna parte. Aquí hay un cierre de JavaScript que hace el trabajo:

var nums = [2, 5, 3, 7]; var result = nums.map( (function() { var lastX = 0; return function(n) { return {x : (lastX += n)}; } }()) ); // result is [{x:2} {x:7} {x:10} {x:17}]


dandavis respuesta dandavis en coffeescript es:

nums.map ((x)->{x: @[0] += x}), [0]

una variación que podría ser un poco más clara

nums.map ((x)->{x: @accum += x}), {accum:0}

usando una comprensión coffeescript (y la misma idea de un acumulador)

accum = 0; z = ({x: accum += i} for i in nums)


JavaScript

Mantenga un contador continuo del total y solo agregue el nuevo número cada vez:

var nums = [2,5,3,7]; var createObject = function(nums){ var result = [], total = 0; for(var i = 0; i < nums.length; i++){ total += nums[i]; result.push({"x": total}); } return result; };

JSFIDDLE


map (-> {x:it}) <| (fold ((acc, a) -> acc ++ [a + ((last acc) ? 0)]), []) <| [2, 5, 3, 7]