JavaScript中的管道功能

Ali*_*eri 1 javascript ecmascript-6

我怎么能有一个JavaScript函数让我们说piper()哪个函数作为参数,它返回一个新函数,将其参数传递给第一个函数,然后将结果传递给第二个函数,然后将第二个结果传递给第三个函数等等,最后返回最后一个函数的输出.

类似于piper(foo, fee, faa)(10, 20, 30)调用的东西faa(fee(foo(10,20,30))).

ps:这是我几天前做的一次采访的一部分.

tri*_*cot 8

对于arbritrary函数,您可以使用此ES6函数:

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

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);
}
// Example call:
var result = piper(Math.min, Math.abs, Math.sqrt)(16, -9, 0)
// Output result:
console.log(result);
Run Code Online (Sandbox Code Playgroud)