V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
ChefIsAwesome
V2EX  ›  JavaScript

JS 函数式编程之递归。

  •  
  •   ChefIsAwesome · 2019-08-29 14:36:37 +08:00 · 2593 次点击
    这是一个创建于 1912 天前的主题,其中的信息可能已经有所发展或是发生改变。

    递归是函数式编程一大特色。函数式风格在 JS 圈子里也很流行。ES6 的数组解构有点模式匹配的味道,用 JS 也能以较为直观的方式写递归。

    下面实现一个对数组做深度 flatMap 的函数,跟大家分享下 JS 写递归的样子。

    flatMap: 把嵌套的数组扁平化。如 flatMap([ [1,2,3], [4,5,6] ]) = [1,2,3,4,5,6]

    函数式风格的伪代码:

     
    flatMap([a, ...as]) = [...flatMap(a), ...flatMap(as)] 
    where a = Array
    
    flatMap([b, ...bs]) = [b, ...flatMap(bs)]
    where b = Anything but Array 
    
    flatMap([]) = []
    
    

    完整的 JS 代码:

    
    const flatMap = function(t) {
      if (t.length === 0) {
        return [];
      }
    
      const [a, ...as] = t;
    
      if (!Array.isArray(a)) {
        return [a, ...flatMap(as)];
      }
    
      return [ ...flatMap(a), ...flatMap(as) ];
    };
    
    
    

    可以看到 JS 写出来也不算罗嗦,还是很清爽的。

    很多人谈起递归就皱眉头,其实递归就是数学归纳法。知道最后返回的是什么类型,知道递归时每种参数的类型,大概想想,写就完事了。

    1 条回复    2019-08-29 20:16:35 +08:00
    dany813
        1
    dany813  
       2019-08-29 20:16:35 +08:00
    挺简洁的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3320 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:38 · PVG 18:38 · LAX 02:38 · JFK 05:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.