您如何编写这样的函数
f()()
f('it') == fit
f()('x') == fox
我有
function f(s){
return "f"+s;
}
答案 0 :(得分:2)
我不仅要从您的问题而且还要从您的评论中分辨出您要查找的内容。看起来每个字符串都以'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!!!'));
答案 1 :(得分:1)
您只有3个必需的输出,并且没有说明其他行为要求。因此,最简单的方法是:
let f = arg =>
arg ? 'f' + arg : arg => arg ? 'fo' + arg : '';
console.log(f()()); // ''
console.log(f('it')); // 'fit'
console.log(f()('x')); // 'fox'
答案 2 :(得分:0)
这是一个非常奇怪的函数,但是如果您第一次没有得到参数,可以通过让命名函数返回一个匿名函数来实现:
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;
}
}
答案 3 :(得分:0)
您可以为一个函数多次调用返回一个函数,并实现一个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
答案 4 :(得分:0)
哈哈,前几天我看到了这个问题,我使用了函数currying:
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'))