在最近的一次采訪中,我被要求撰寫一個添加數字并接受如下引數的函式:
console.log(sum())
console.log(sum()())
console.log(sum(1));
console.log(sum(1)());
console.log(sum(1)(2)());
console.log(sum(1, 2)());
console.log(sum(1)(2)(3)());
console.log(sum(1)(2, 3)());
console.log(sum(1)(2, 3));
console.log(sum(1)(2)(3)(4)());
console.log(sum(1)(2, 3, 4)());
console.log(sum(1, 2, 3, 4)());
console.log(sum(1, 2, 3, 4));
但我無法解決下面的答案,如何在下面的輸出中將默認設定為 0?
console.log(sum())
console.log(sum()())
uj5u.com熱心網友回復:
這有幫助嗎!
function curry(f) {
return function(a) {
return function(b) {
/*return function(c) {
return function(d) {
return f(a, b, c, d);
}
}*/
return f(a, b);
};
};
}
// usage
function sum(a, b /*, c, d*/) {
if(a && b /*&& c && d*/) {
return a b; // c d;
} else {
return 0;
}
}
const curriedSum = curry(sum);
document.write( curriedSum()() );
uj5u.com熱心網友回復:
那么解決方案應該是這樣的:
const sum = (...args) => {
const reducer = (acc, arg) => acc arg;
let total = args.reduce(reducer, 0)
const add = (...args2) => {
if (args2.length) {
total = args2.reduce(reducer, total)
return add
}
return total
}
add.toString = () => total;
add.valueOf = () => total;
return add
}
console.log(sum())
console.log(sum()())
console.log(sum(1));
console.log(sum(1)());
console.log(sum(1)(2)());
console.log(sum(1, 2)());
console.log(sum(1)(2)(3)());
console.log(sum(1)(2, 3)());
console.log(sum(1)(2, 3));
console.log(sum(1)(2)(3)(4)());
console.log(sum(1)(2, 3, 4)());
console.log(sum(1, 2, 3, 4)());
console.log(sum(1, 2, 3, 4));
似乎我無法安靜地找到需要重寫以獲得良好輸出的函式。
所以萬一console.log(sum())你會得到? add()。但是如果你這樣寫,console.log("" sum())你會進入0控制臺。console.log沒有toString自動呼叫:(可能需要另外覆寫其他一些方法。
uj5u.com熱心網友回復:
使用 toString ad valueOf 得到結果。使用帶有 spread 的 curried 函式將傳入的值作為陣列獲取。使用reduce來做加法。
function sum(...args){
let v = 0;
const f = (...args) => {
v = args.reduce((x,n) => x n, v);
return f;
};
f.valueOf = f.toString = () => v;
return f.apply(f, args);
}
console.log(sum())
console.log(sum()())
console.log(sum(1));
console.log(sum(1)());
console.log(sum(1)(2)());
console.log(sum(1, 2)());
console.log(sum(1)(2)(3)());
console.log(sum(1)(2, 3)());
console.log(sum(1)(2, 3));
console.log(sum(1)(2)(3)(4)());
console.log(sum(1)(2, 3, 4)());
console.log(sum(1, 2, 3, 4)());
console.log(sum(1, 2, 3, 4));
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506185.html
標籤:javascript 反应 数组 咖喱
下一篇:從物件陣列中訪問特定物件
