HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavascriptMinor

Nested Skips (UPenn)

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
upennnestedskips

Problem

Exercise 1: skips :: [a] -> [[a]]


The nth list in the output should contain every nth element from the
input list. For example, skips "hello!" == ["hello!", "el!", "l!",
"l", "o", "!"].

The question UPenn Homework 3: skips function and it's associated answers inspired me to write a solution in Javascript. I used the opportunity to (finally) better understand high order array functions. If you would be so kind to critique:

  • Code Layout, specifically if nesting function skips() makes any sense and why.



  • Do higher order functions provide more than just readability, are they more efficient?



  • Can I make the nested function skips() better (readable/faster)?



  • Anything at all.



function skip(str, cb) {
  var input = str.split('');

  cb(input.map(skips));

  function skips(val, index, arr) {
    var res = [];
    var i = index;
    var iterator = i + 1;
    for (i; i < arr.length; i += iterator){
      res.push(arr[i]);
    }
    return res;
  }
}

skip('hello!', console.log);

Solution

Ok, first off: Passing in console.log as a paramater seems unnecessary. The function should have one task:


Generate the skips

Then once you have the skips you can do whatever you want with it. So:

function skip(str, cb) -> function skip(str)


and:

skip('hello!', console.log); -> console.log(skip('hello'));


I would also not use a function within a function. I would try keeping the functions relatively small. Split the functions:

function skipHelper(val, index, arr) {
  var res = [];
  var i = index;
  var iterator = i + 1;
  for (i; i < arr.length; i += iterator){
    res.push(arr[i]);
  }
  return res;
}

function skip(str) {
  var input = str.split('')
  return input.map(skips);
}


Also, given that str.split('') isn't too much to explicitly write out, change:

var input = str.split('')
  return input.map(skips);


To just:

return str.split('').map(skips);


Also, your code doesn't run exactly as described. Add a .join('') to return res; and this should fix it:

return res; -> return res.join('');


All in all:

function skipHelper(val, index, arr) {
  var res = [];
  var i = index;
  var iterator = i + 1;
  for (i; i < arr.length; i += iterator){
    res.push(arr[i]);
  }
  return res.join('');
}

function skip(str) {
  return str.split('').map(skipHelper);
}

console.log(skip('hello!'));


There are probably some Javascript language specific stylistic choices I am missing, but this is for general code structure.

Code Snippets

function skip(str, cb) -> function skip(str)
skip('hello!', console.log); -> console.log(skip('hello'));
function skipHelper(val, index, arr) {
  var res = [];
  var i = index;
  var iterator = i + 1;
  for (i; i < arr.length; i += iterator){
    res.push(arr[i]);
  }
  return res;
}

function skip(str) {
  var input = str.split('')
  return input.map(skips);
}
var input = str.split('')
  return input.map(skips);
return str.split('').map(skips);

Context

StackExchange Code Review Q#103903, answer score: 2

Revisions (0)

No revisions yet.