如何使用JavaScript中的咖喱来编写具有无限参数数量的总和函数



我尝试编写以下代码,以使用sum函数查找'n'数字的总和。我在>"输出"中获得了正确的响应。但是我无法使用总和函数返回该功能,因为我总是必须返回一个函数,这是咖喱效应所必需的。

请帮忙。预先感谢。

var output = 0,
  chain;
function sum() {
  var args = Array.prototype.slice.call(arguments);
  output += args.reduce(function(a, b) {
    return a + b;
  });
  sumCurried = sum.bind(output);
  sumCurried.val = function() {
  return output;
  }
  return sumCurried;
}
debugger;
document.getElementById('demo').innerHTML = sum(1, 2)(3)(4);
// document.getElementById('demo').innerHTML = sum(1)(3)(4);
<p id='demo'></p>

enter code here

您可以在咖喱函数中添加停止条件 - 如果未经参数调用函数,则返回输出:

var output = 0,
  chain;
function sum() {
  var args = Array.prototype.slice.call(arguments);
  
  if(args.length === 0) {
    return output;
  }
  
  output += args.reduce(function(a, b) {
    return a + b;
  });
  sumCurried = sum.bind(output);
  
  return sumCurried;
}
console.log(sum(1, 2)(3)(4)());
<p id='demo'></p>

返回的咖喱函数具有val属性,该功能是返回当前值的函数:

var output = 0,
  chain;
function sum() {
  var args = Array.prototype.slice.call(arguments);
  output += args.reduce(function(a, b) {
    return a + b;
  });
  sumCurried = sum.bind(output);
  sumCurried.val = function() {
    return output;
  }
  return sumCurried;
}
console.log(sum(1, 2)(3)(4).val());
<p id='demo'></p>

您为什么完全使用咖喱?但是,这是一个较短的版本:

 const sum = (...args) => {
   const func = (...s)=> sum(...args,...s);
   func.value = args.reduce((a,b)=>a+b,0);
   return func;
 };
 //usable as
sum(1,2).value,
sum(1,1)(1).value,
sum(1,1)(1,1)(1,1).value

您总是需要结束咖喱链。但是,它可以缩短:

  func.valueOf = ()=> args.reduce((a,b)=>a+b,0);
  //( instead of func.value = ... )

因此,当打电话给您时,您可以做:

  +sum(1,2,3)
 +sum(1)(1)(1)

最新更新