如何在 Javascript 中将一种方法的输出通过管道传输到另一种方法的输入?
How to pipe output of one method to the input of the other in Javascript?
假设我有一个函数数组如下
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 中一次调用一个函数并以第一个函数的结果成为第二个函数的输入的方式将所有项传递给它们,依此类推?我想将它们链接在一起(管道)。
此解决方案未正确管道化(如 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()
的输入等
您可以使用 .reduce()
method:
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);
假设我有一个函数数组如下
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 中一次调用一个函数并以第一个函数的结果成为第二个函数的输入的方式将所有项传递给它们,依此类推?我想将它们链接在一起(管道)。
此解决方案未正确管道化(如 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()
的输入等
您可以使用 .reduce()
method:
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);