Búsqueda de sitios web

javascript - _.chain - underscore JS


Este código funciona bien

var arr = _.range(1,1000);
var parse = _.filter(arr, function(num) {return num%3===0 || num%5===0});
var sum = _.reduce(parse, function(memo, num){ return memo + num; }, 0) //233168

¿Es posible usar la función _.chain() para limpiar este código? He intentado el código a continuación, pero da un error de tipo.

var arr = _.range(1,1000);
var sum = _.chain(arr)
        .filter(arr, function(num) {return num%3===0 || num%5===0})
        .reduce(arr, function(memo, num){ return memo + num; }, 0)
        .value();

Respuesta #1

Solo necesitas eliminar el primer argumento (arr) de cada una de las funciones que tienes dentro de _.chain() y _.value() (ya que ahora se obtienen de la cadena):

var arr = _.range(1,1000);
var sum = _.chain(arr)
    .filter(function(num) {return num%3===0 || num%5===0})
    .reduce(function(memo, num){ return memo + num; }, 0)
    .value();

Y también podrías hacerlo un poco más conciso, dividiendo los argumentos de rango (es decir, 1 y 1000) entre la función chain y la función range:

var sum = _.chain(1).range(1000)
    .filter(function(num) {return num%3===0 || num%5===0})
    .reduce(function(memo, num){ return memo + num; }, 0)
    .value();

Funciona, pero no estoy seguro de si este último es una buena idea en términos de legibilidad del código.

Respuesta #2

Esto funciona y es (IMHO) un poco más claro.

var sum = _(_.range(1000)).chain()
          .filter(function (x) { return (x % 3 === 0  ||  x % 5 === 0) })
          .reduce(function (sum, x) { return sum + x }, 0)
          .value();    /* try chaining range() and reduce() */

Supongo que está bien resolver koans de JavaScript aquí?