如何在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中一次调用一个函数,并将所有项传递给它们,使第一个函数的结果成为第二个函数的输入,依此类推?我想把它们连在一起(管道)。
您可以使用.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()
的输入等。
相关文章:
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- 将一个方法转换为promise:Nodejs
- 如何在所有ng点击事件AngularJS上启动一个方法
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- 拆散一个大班的巧妙方法
- 如何创建一个方法来验证数组的范围
- 如何将一个方法延迟到另一个方法首先完成,javascript
- Angular2将组件方法导入到另一个组件中
- 你能把一个匿名方法(函数)动态地变成一个命名方法吗
- 在Javascript中对类的每个实例调用一个方法
- 如何重写一个方法,并且仍然能够在重写的方法中使用基方法
- 将其中一个异步方法重写为使用promise的方法
- 添加一个setTimeout方法会使jQuery悬停方法忽略setTimeout方法中的函数
- 一个jquery验证器方法,它不接受纯数字或纯特殊字符,但接受上面是否有字母
- JQuery是否有一个“;移动“;作用或者有没有一种更紧凑的方法来做到这一点
- 我应该返回一个类似console.log()的方法调用吗
- AngularJS从对象中获取另一个值的方法
- JavaScript 方法一个有效,另一个无效
- 正确的删除方法一个属性
- QUnit:每个方法一个测试,每个方法有多个断言或多个测试