V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
frankkai
V2EX  ›  前端开发

想看大家做这道题的答案

  •  
  •   frankkai · 2021-03-26 19:51:48 +08:00 via iPhone · 1810 次点击
    这是一个创建于 1339 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想看大家做这道题的答案
    用 JavaScript 实现一个 add(1,2,3)(4)(5)(6,7)(8)()

    返回结果为这些数字的和:36 。
    第 1 条附言  ·  2021-03-27 01:03:09 +08:00

    贴一下自己的答案: 加

    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-03-26 19:55:37 +08:00 via iPhone
    柯里化
    imdong
        2
    imdong  
       2021-03-26 20:09:50 +08:00
    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-03-26 20:10:56 +08:00
    呃,变量名忘记改了,_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-03-26 21:50:39 +08:00
    frankkai
        5
    frankkai  
    OP
       2021-03-26 22:06:40 +08:00 via iPhone
    @imdong 不错
    enchilada2020
        6
    enchilada2020  
       2021-03-26 22:29:45 +08:00
    优化了下 #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-03-26 22:38:43 +08:00
    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-03-26 22:55:05 +08:00   ❤️ 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-03-27 01:04:07 +08:00
    @muxw6 很精简啊
    iMusic
        10
    iMusic  
       2021-03-27 09:45:25 +08:00
    以前见过类似的题
    ```
    sum(2)(3) 和 sum(2, 3)
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2880 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 11:59 · PVG 19:59 · LAX 03:59 · JFK 06:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.