zoukankan      html  css  js  c++  java
  • [Javascript] Intro to Recursion

    Previous post: http://www.cnblogs.com/Answer1215/p/4990418.html

    let input, config, tasks;
    
    input = ['dist'];
    
    config = {
      "dist": ["build", "deploy"],
      "build": ['js', 'css', 'vender'],
      "js": ['babel', 'ng-Annotate', "uglify"],
      "css": ["sass", "css-min"]
    };
    
    tasks = [];
    
    getTasks(input);
    
    function getTasks(input){
      
      input.forEach((task)=>{
        if(config[task]){
          getTasks(config[task]);
        }else{
          tasks.push(task);
        }
      })
    };
    
    console.log(tasks);

    The getTasks works but has some problem:

    • we depend on the outside variable 'tasks' and 'config', so there are side effect
    • there is no return value, hard to test
    let input, config, tasks;
    
    input = ['dist'];
    
    config = {
      "dist": ["build", "deploy"],
      "build": ['js', 'css', 'vender'],
      "js": ['babel', 'ng-Annotate', "uglify"],
      "css": ["sass", "css-min"]
    };
    
    tasks = [];
    
    var res = getTasks(input, []);
    
    function getTasks(input, initial){
      
      return input.reduce((prev, next)=>{
        if(config[next]){
          return getTasks(config[next], prev);
        }else{
          return prev.concat(next);
        }
      }, initial);
    };
    
    console.log(res);

    The code has been improved, we return the value from the getTasks() function and we don't modify the tasks array anymore.

    Just one thing we still need to do is we still depend on 'config':

    let input, config;
    
    input = ['dist'];
    
    config = {
      "dist": ["build", "deploy"],
      "build": ['js', 'css', 'vender'],
      "js": ['babel', 'ng-Annotate', "uglify"],
      "css": ["sass", "css-min"]
    };
    
    var res = getTasks(config, input, []);
    
    function getTasks(config, input, initial){
      
      return input.reduce((prev, next)=>{
        if(config[next]){
          return getTasks(config ,config[next], prev);
        }else{
          return prev.concat(next);
        }
      }, initial);
    };
    
    console.log(res);
  • 相关阅读:
    springboot配置redis缓存
    【spark】local模式运行
    mybatis从入门到精通(二) 增删查改
    学习设计模式
    学习设计模式
    mybatis从入门到精通(一) 入门
    学习NIO 之 使用方法
    学习 NIO 之 零拷贝
    Java并发
    学习设计模式
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5055914.html
Copyright © 2011-2022 走看看