【问题标题】:How to pipe output of one method to the input of the other in Javascript?如何在Javascript中将一种方法的输出通过管道传输到另一种方法的输入?
【发布时间】:2016-07-30 22:20:44
【问题描述】:

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

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 中一次调用一个函数并将所有项目传递给它们,以使第一个函数的结果成为第二个函数的输入,依此类推?我想将它们链接在一起(管道)。

【问题讨论】:

    标签: javascript piping


    【解决方案1】:

    您可以使用.reduce() method:

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

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

    展开sn-p查看结果:

    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);

    【讨论】:

      【解决方案2】:

      这个解决方案不是正确的管道(如> 或 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)

      【讨论】:

        【解决方案3】:

        作为一种比较简单的方法,可以调用:

        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()的输入等等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-10
          • 2018-10-15
          • 1970-01-01
          • 2010-11-17
          • 1970-01-01
          • 2016-09-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多