【问题标题】:Using reduce method for piping使用reduce方法进行管道
【发布时间】:2019-02-02 06:17:59
【问题描述】:

trincot 在 2016 年 10 月发表了一篇关于使用 reduce 方法 (link to posting) 构建管道函数的精彩帖子,我正在尝试详细了解代码。

ES6 版本

function piper(...fs) {
    return (...args) => fs.reduce((args,f) => [f.apply(this,args)],args)[0];
}

具体来说:
1. 代替[f.apply(this.args)]f(...args) 也可以工作,但f(args) 不工作。为什么f(args) 不起作用?
2.关于内部(匿名)“reduce”函数中的第二个参数,为什么args甚至是必要的? . . .,即为什么下面的代码不起作用?

function piper(...fs) {
    return (...args) => fs.reduce((args,f) => [f.apply(this,args)])[0];
}

B.或者,为什么我们不能只使用[] 作为参数而不是args

function piper(...fs) {
    return (...args) => fs.reduce((args,f) => [f.apply(this,args)],[])[0];
}

ES5 版本

function piper(/* functions */) {
    var fs = [].slice.apply(arguments);    
    return function (/* arguments */) { 
        return fs.reduce(function (args,f) {
            return [f.apply(this,args)];
        }.bind(this), [].slice.apply(arguments))[0];
    }.bind(this);
}

问题: 1、在内部(匿名)reduce函数中,为什么需要第二个参数[].slice.apply(arguments)?即,为什么 [] 不能代替它工作?
2. 或者,为什么我们不能完全忽略这个参数?

非常感谢您帮助我更深入地了解这些问题。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    作为第二个参数传递给reduce函数的args需要指定累加器的初始值(即args变量),这样在第一次迭代,

    fs.reduce((args,f) =>
    

    导致args 成为初始参数(如预期的那样)。否则,如果不将初始值传递给.reduceargs 的初始值将是fns 数组中的第一项,这绝对不是您想要的:

    function piper(...fs) {
        return (...args) => fs.reduce((args,f) => {
          console.log(args);
          return [f.apply(this,args)];
        })[0];
    }
    
    var result = piper(Math.min, Math.abs, Math.sqrt)(16, -9, 0)
    // Output result:
    console.log(result);

    另外,像这样,fns 数组中的第一个函数根本不会被调用。

    通常,当累加器的类型与被迭代的数组中的项目类型匹配时,您只为.reduce 留下一个初始值并且匹配所需的结果类型,就像数字操作一样:

    // sum:
    const result = [1, 2, 3].reduce((a, b) => a + b);
    console.log(result);

    当然,如果数组有可能被迭代为空,您还应该提供一个初始值。

    在(几乎?)所有其他情况下,为.reduce 工作提供初始值是必要的。

    【讨论】:

    • 即便如此,提供0 的初始值可能是合适的,这样在调用reduce() 时不会抛出空数组。
    猜你喜欢
    • 2020-10-03
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2022-07-14
    • 2022-11-15
    • 1970-01-01
    相关资源
    最近更新 更多