【问题标题】:javascript function rules with multiple parameter braces带有多个参数大括号的 javascript 函数规则
【发布时间】:2019-10-26 05:46:05
【问题描述】:

你会怎么写这样的函数

f()()

f('it') == fit
f()('x') == fox

我有

function f(s){
  return "f"+s;
}

【问题讨论】:

标签: javascript


【解决方案1】:

这是一个非常奇怪的函数,但是如果你第一次没有得到参数,你可以让你的命名函数返回一个匿名函数:

function f(s, str) {
  if(typeof str === "undefined") {
    str = "f"
  }
  if(typeof s === "undefined") {
    return function(t) {
      return f(t, str + "o")
    }
  } else {
    return str + s;
  }
}

【讨论】:

  • 我想到了——好的,它通过了 2 个测试
  • 这错过了第一个例子,f()(),我相信它应该返回一个空字符串。
  • 失败 -- f()()('bar') == foobar
  • @TheOldCounty 好的,这让我知道他们真正想要什么。稍等,即将进行编辑。
  • 这样的递归函数
【解决方案2】:

您只有 3 个必需的输出,并且没有解释其他行为要求。因此,最简单的方法是:

let f = arg => 
  arg ? 'f' + arg : arg => arg ? 'fo' + arg : '';

console.log(f()()); // ''
console.log(f('it')); // 'fit'
console.log(f()('x')); // 'fox'

【讨论】:

    【解决方案3】:

    您可以为多次调用该函数返回一个函数,并实现一个toString 方法来获取最终字符串。

    function f(v) {
        var s = 'f' + (v || 'o');
        function g(v) {
            s += v || 'o';
            return g;
        };
        g.toString = function () { return s; };
        return g;
    }
    
    console.log(f()());                // foo
    console.log(f('it'));              // fit
    console.log(f()('x'));             // fox
    console.log(f()()('b')('a')('r')); // foobar

    【讨论】:

    • 这很接近 - 但失败了 ---- (function() { const g = f()(); const h = g()(); return g('l') + ' ' + h('l'); })() -- 输出 === 傻瓜 fooool ---- 目前作为 fooool fooooll 出来
    【解决方案4】:

    我不仅要从您的问题中,还要从您的 cmets 中辨别出您在寻找什么。看起来每个字符串都以'f' 开头,每个空括号对都附加一个'o'。最后,一个非空括号对附加它的参数。

    我实际上认为这是一个很酷的元编程挑战。

    这应该可行:

    let f = (str, depth=0) => str
      ? `f${'o'.repeat(depth)}${str}` // If given param, terminate
      : str => f(str, depth + 1);     // If no param, return func
    
    // "fit"
    console.log(f('it'));
    
    // "fox"
    console.log(f()('x'));
    
    // "fortress"
    console.log(f()('rtress'));
    
    // "football"
    console.log(f()()('tball'));
    
    // "foooooool!!!"
    console.log(f()()()()()()()('l!!!'));

    【讨论】:

      【解决方案5】:

      哈哈我前几天看到这个问题,我用了函数柯里化:

      var f = s => s ? `f${s}` : (g=o=>e=>e?`f${o+e}`:g(o+'o')) && g('o') 
      
      console.log(f('x'))
      console.log(f()()('l'))
      console.log(f()()()('bar'))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-03
        • 1970-01-01
        • 2019-07-01
        • 2017-07-30
        • 2011-03-01
        • 2019-02-16
        • 1970-01-01
        相关资源
        最近更新 更多