[Javascript] Intro to Recursion - Refactoring to a Pure Function

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

 

posted @ 2015-12-18 03:06  Zhentiw  阅读(207)  评论(0编辑  收藏  举报