When using recursion, you must be mindful of the dreaded infinite loop
. Using the recursive function that we’ve built up over the previous lessons, we look at how a simple duplicated configuration item could cause chaos for our program as it has no context of which items it has previously seen. We fix this problem by introducing a parents
array, which can keep track of which top-level commands have already been accessed.
Previous:
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);
----------
Code:
let input, config; input = ['dist']; config = { "dist": ["build", "deploy"], "build": ['js', 'css', 'vender', 'dist'], "js": ['babel', 'ng-Annotate', "uglify"], "css": ["sass", "css-min"] }; var res = getTasks(config, input); function getTasks(config, input, initial, parent){ initial = initial || []; parent = parent || []; return input.reduce((prev, next)=>{ if(parent.indexOf(next) > -1){
console.log('infinite loop detected!'); return prev; } if(config[next]){ return getTasks(config ,config[next], prev, parent.concat(next)); }else{ return prev.concat(next); } }, initial); }; console.log(res);