zoukankan      html  css  js  c++  java
  • [Javascript] Transduce over any Iteratable Collection

    So far we've been transducing by manually calling .reduce() on arrays, but we want to be able to transduce over other collection types as well.

    In this lesson we'll create a transduce function to support transducing over any data structure that implements the es2015 iterable protocol. We’ll put it to the test by transducing over strings and maps, as well as going from one collection type as input to another as output.

    The whole point to make transducer work for all iteratable collection is that, iteratable collction can be Map, TypedArray, Array, Set and String.

    Current the implement from last post:

    [1, 2, 3, 4].reduce(
      compose(isNot2Filter, isEvenFilter, doubleMap)(pushReducer),
      [],
    );
    
    const transduce = (xf, reducer, seed, collection) => {
      collection.reduce(xf(reducer), seed)
    }

     This implementaion only works for Array type. 

    If we want Transducer can be used for all Itertable type, we need to change by using 'reduce' to 'for...of' loop.

    const transduce = (xf, reducer, seed, collection) => {
      const transformedReducer = xf(reducer);
      let accumulation = seed;
      for (const value of collection) {
        accumulation = transformedReducer(accumulation, value);
      }
    
      return accumulation;
    }

    Now that, we can use for any iteratable collection not only Array type:

    const toUpper = str => str.toUpperCase();
    const isVowel = char => ['a', 'e', 'i', 'o', 'u', 'y'].includes(char.toLowerCase());
    
    transduce(
      compose(map(toUpper), filter(isVowel)),
      (str, char) => str + char,
      '',
      'adrian',
    ); 
    
    const numMap = new Map();
    numMap.set('a', 1);
    numMap.set('b', 2);
    numMap.set('c', 3);
    numMap.set('d', 4);
    
    transduce(
      compose(isNot2Filter, isEvenFilter, doubleMap),
      pushReducer,
      [],
      numMap.values(),
    );
  • 相关阅读:
    杂记:Linux下gcc升级
    杂记:OSX下编译安装最新版RedisDesktopMmanager
    查漏补缺:Vector中去重
    Mac下使用VScode进行C/C++开发
    添砖加瓦:几种常见的数据摘要算法(MD5、CRC32、SHA1和SHA256)
    添砖加瓦:snappy无损压缩算法
    杂记:OSX 安装openssl
    码海拾遗:内存四区
    Luogu 4284 [SHOI2014]概率充电器
    Luogu 4473 [国家集训队]飞飞侠
  • 原文地址:https://www.cnblogs.com/Answer1215/p/8298623.html
Copyright © 2011-2022 走看看