1

Quiero lograr en cadenar de algun modo los argumentos de una función de este modo : function suma(a)(b)(c)...{}

y que retorne la suma de todos los valores. No se como se le llama a esto y no se como funciona. Agradecería si pudiese alguien explicarme o darme algun ejemplo por favor. (A ser posible que sea lo mas plain js posible)

2 Answers2

4

Si tienes algo como:

suma(1)(2)(3);

significa que suma(n) es una función que devuelve una función:

let fn = suma(1);
let fn2 = fn(2);
let fn3 = fn2(3);

Asumamos que para obtener el resultado final llamemos a la función sin parámetros:

fn3() === 6 //true

entonces tendremos que crear una función recursiva cuyo caso base es llamarla sin parámetros, mientras que el caso genérico sería llamarla con un parámetro que se suma:

function suma(s) {
  return function clausura(n2) {
     if (n2 !== undefined) {
      s += n2;
      return clausura;
     }
     return s;
  }
}

console.log(suma(1)(2)(3)())


    

Te recomiendo leer sobre las clausuras de función para poder entender el funcionamiento de esta función recursiva con acumulador.

Por otro lado, podrías hacer algo mucho más simple con una función que admite diferentes cantidades de parámetros:

function suma() {
  if (arguments.length == 0) {
    return 0;
  }
  let acc=0;
  for (let i = 0; i < arguments.length; i++) {
    acc+= arguments[i];
  }
  return acc;
}

console.log(suma(1, 2, 3));
console.log(suma(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
Pablo Lozano
  • 45,934
  • 7
  • 48
  • 87
1

Si lo que quieres es una función que retorne la suma de todos los valores de un array, utiliza la función nativa reducede Javascript:

let arr = [18, 85, 5, 35];
let res = arr.reduce((sum, el) => {
  return sum += el;
}, 0);
console.log(res);

Esta es una de las funcionalidades que puedes utilizar junto con map y filter que igual son más desconocidas pero van realmente bien para tratar arrays. Te recomiendo la siguiente lectura: https://medium.com/poka-techblog/simplify-your-javascript-use-map-reduce-and-filter-bd02c593cc2d

tevvek
  • 1,030
  • 3
  • 8
  • Lo que busco es que a una función se le puedan declarar los argumentos de esta manera: sum(arg1)(arg2)....(arg20) y retorne la suma de todos estos. – guskikalola Feb 26 '19 at 09:53
  • Podrías llegar a conseguirlo si hicieras una función que devolviese otra función y así poder llamarla con el numero parámetro, pero es mala práctica y no tiene sentido. Lo que escribí como código es lo más conciso y correcto que puedes hacer para sumar una serie de valores. – tevvek Feb 26 '19 at 09:56