使用减少管道的方法

时间:2019-02-02 06:17:59

标签: javascript

2016年10月,从trincot发表了一篇精彩的文章,内容涉及使用reduce方法(link to posting)构造管道函数,我正在尝试详细了解代码。

ES6版

@media only screen and (max-width: 960px) {
 .wyomingx,
 .coloradox,
 .mainex,
 .dc2x,
 .nyx,
 .signsx {
    opacity: 0;
 }
}

具体地:
1. function piper(...fs) { return (...args) => fs.reduce((args,f) => [f.apply(this,args)],args)[0]; } 也可以代替[f.apply(this.args)],但是f(...args)不起作用。 f(args)为什么不起作用?
2.关于内部(匿名)“ reduce”函数中的第二个参数,为什么f(args)甚至是必要的? 。 。 。,即以下代码为何不起作用?

args

B。另外,为什么我们不能仅使用function piper(...fs) { return (...args) => fs.reduce((args,f) => [f.apply(this,args)])[0]; } 而不是[]作为参数?

args

ES5版本

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

问题: 1.在内部(匿名)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); } 功能,为什么还需要第二个参数reduce?即为什么[].slice.apply(arguments)不能代替它?
2.另外,我们为什么不能只是省去了参数完全?

在此先感谢您帮助我更深入地了解这些问题。

1 个答案:

答案 0 :(得分:1)

作为第二个参数传递给var data = 0 const sheets = google.sheets({version: 'v4', auth}) console.log("start search") sheets.spreadsheets.values.get(request, function(err, response) { if (err) {} var data = search(response, string) console.log("search complete") }); console.log("data return point") return data; 函数的start search data return point search complete 需要指定累加器的初始值(即args变量),因此在第一次迭代中,

reduce

args作为初始参数(如预期)。否则,在不将初始值传递给fs.reduce((args,f) => 的情况下,args的初始值将 .reduce数组中的第一项,这肯定不是你想要的:

args

此外,像这样,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的工作必须提供一个初始值。