frankkai
V2EX  ›  前端开发

想看大家做这道题的答案

By frankkai at 2021 年 3 月 26 日 · 2616 次点击
想看大家做这道题的答案
用 JavaScript 实现一个 add(1,2,3)(4)(5)(6,7)(8)()

返回结果为这些数字的和:36 。
第 1 条附言  ·  2021 年 3 月 27 日

贴一下自己的答案: 加

function sum(){
    const result = [...arguments].reduce((acc, cur)=>acc+cur)
    return function(){
            if(arguments.length === 0)return result
            return sum(...[...arguments, result]);
    }
}

柯里化的加减乘除

function curry(callback){
    return function curried (){
        const result = callback(arguments)
        return function(){
                if(arguments.length === 0)return result
                return curried(...[result, ...arguments]);
        }
    }
}


let sum = (args) =>{
    return [...args].reduce((acc, cur)=>acc+cur)
}

let minus = (args) =>{
    return [...args].reduce((acc, cur)=>acc-cur)
}


let multiple = (args) =>{
    return [...args].reduce((acc, cur)=>acc*cur)
}

let divide = (args) =>{
    return [...args].reduce((acc, cur)=>acc / cur)
}


let currySum = curry(sum)
let curryMultiple = curry(multiple)
let curryDivide = curry(divide)
let curryMinus = curry(minus)

console.log(currySum(1,2,3)(4)(5)(6,7)(8)())
console.log(curryMultiple(1,2,3)(4)(5)(6,7)(8)())
console.log(curryDivide(1,2,3)(4)(5)(6,7)(8)())
console.log(curryMinus(1,2,3)(4)(5)(6,7)(8)())
10 条回复  •  2021-03-27 09:45:25 +08:00
powerfulyang
   1
powerfulyang  
   2021 年 3 月 26 日 via iPhone
柯里化
imdong
   2
imdong  
   2021 年 3 月 26 日
function add() {
let nums = Array.from(_args);

return function () {
nums = nums.concat(Array.from(_args));

if (arguments.length <= 0) {
return nums.reduce(function (prev, cur) {
return prev + cur;
}, 0);
}

return arguments.callee;
};
}

add(1, 2, 3)(4)(5)(6, 7)(8)()
imdong
   3
imdong  
   2021 年 3 月 26 日
呃,变量名忘记改了,_args 应改为 arguments

正确代码应该是:

function add() {
let nums = Array.from(arguments);

return function () {
nums = nums.concat(Array.from(arguments));

if (arguments.length <= 0) {
return nums.reduce(function (prev, cur) {
return prev + cur;
}, 0);
}

return arguments.callee;
};
}

add(1, 2, 3)(4)(5)(6, 7)(8)()
Elethom
   4
Elethom  
   2021 年 3 月 26 日
frankkai
   5
frankkai  
OP
   2021 年 3 月 26 日 via iPhone
@imdong 不错
KMpAn8Obw1QhPoEP
   6
KMpAn8Obw1QhPoEP  
   2021 年 3 月 26 日
优化了下 #3 的代码 有错请轻喷。。
```JavaScript
const infiniteAdd = function () {
const args = [...arguments];
return function f() {
if (!arguments.length) return args.reduce((acc, cur) => acc + cur, 0);
args.push(...arguments);
return f;
}
};

console.log(infiniteAdd(1, 2, 3)(4, 5)(6)(7, 8, 9, 10)(11, 12)()); // 78
```
IsaacYoung
   7
IsaacYoung  
   2021 年 3 月 26 日
function curry(fn) {
let p = [];
const wrapper = function (...args) {
if(args.length) {
p = p.concat(args);
return wrapper
} else {
return fn(...p)
}
}
return wrapper
}
function addOriginal (...args) {
return args.reduce((prev, curr) => prev + curr, 0)
}

const add = curry(addOriginal)
muxw6
   8
muxw6  
   2021 年 3 月 26 日   ❤️ 2
function add(...args) {
return function(..._args) {
return _args.length>0 ? add(...args, ..._args) : args.reduce((a, c) => a + c)
}
}
frankkai
   9
frankkai  
OP
   2021 年 3 月 27 日
@muxw6 很精简啊
MzM2ODkx
   10
MzM2ODkx  
   2021 年 3 月 27 日
以前见过类似的题
```
sum(2)(3) 和 sum(2, 3)
```
© 2026 V2EX · 35ms · 3.9.8.5