如何在Javascript中通过管道将一个方法的输出连接到另一个的输入

How to pipe output of one method to the input of the other in Javascript?

本文关键字:方法 一个 输出 连接 输入 另一个 Javascript 管道      更新时间:2023-09-26

假设我有一个函数数组,如下

var updateCountryToCanada = function (items) {
    return items.map(i => {i['country'] = 'Canada'; return i});
}
var strip_punctuation_from_name = function (items) {
    return items.map(i => {i['name'] = i['name'].replace('.', '-');
    return i}); 
}

以及下的项目阵列

var items = [{'name': 'John.Joo', 'height': 160, 'country':'US'},
    {'name': 'Isla', 'height': 180, 'country':'France'},
    {'name': 'Sam'}];

我把我所有的功能都放在一个数组中

var funcs = [updateCountryToCanada, strip_punctuation_from_name]

现在,我的问题是,如何在JavaScript中一次调用一个函数,并将所有项传递给它们,使第一个函数的结果成为第二个函数的输入,依此类推?我想把它们连在一起(管道)。

您可以使用.reduce()方法:

var result = funcs.reduce((r, f) => f(r), items);

这将为funcs数组中的每个项调用(r, f) => f(r)函数。第一次,r将是items。对于随后的每一个r将是从上一个调用返回的任何值。f是来自funcs的当前项目。

展开代码段以查看结果:

var updateCountryToCanada = function (items) {
    return items.map(i => {i['country'] = 'Canada'; return i});
}
var strip_punctuation_from_name = function (items) {
    return items.map(i => {i['name'] = i['name'].replace('.', '-');
    return i}); 
}
var items = [{'name': 'John.Joo', 'height': 160, 'country':'US'},
    {'name': 'Isla', 'height': 180, 'country':'France'}];
var funcs = [updateCountryToCanada, strip_punctuation_from_name];
var result = funcs.reduce((r, f) => f(r), items);
console.log(result);

此解决方案未正确管道化(如Unix中的>|),但您可以执行以下操作:

for (i = 0; i < funcs.length; i++) {
  items = funcs[i](items);
}

var updateCountryToCanada = function (items) {
  return items.map(i => {i['country'] = 'Canada'; return i});
}
var strip_punctuation_from_name = function (items) {
  return items.map(i => {i['name'] = i['name'].replace('.', '-'); return i}); 
}
var items = [{'name': 'John.Joo', 'height': 160, 'country':'US'},
    {'name': 'Isla', 'height': 180, 'country':'France'},
    {'name': 'Sam'}];
var funcs = [updateCountryToCanada, strip_punctuation_from_name];
for (i = 0; i < funcs.length; i++) {
  items = funcs[i](items);
}
console.log(items)

作为一种相对简单的方法,您可以调用:

functionOne();

如果functionOne()看起来像:

function functionOne() {
    [... CODE ...]
    var result = [...WHATEVER...];
    functionTwo(result);
}

然后functionTwo()看起来像:

function functionTwo(input) {
    var input = input;
    [... CODE ...]
    var result = [...WHATEVER...];
    functionThree(result);
}

然后functionOne()的结果将是functionTwo()的输入,functionTwo()的结果将为functionThree()的输入等。