patternjavascriptMinor
Nested Skips (UPenn)
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:
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
Generate the skips
Then once you have the skips you can do whatever you want with it. So:
and:
I would also not use a function within a function. I would try keeping the functions relatively small. Split the functions:
Also, given that
To just:
Also, your code doesn't run exactly as described. Add a
All in all:
There are probably some Javascript language specific stylistic choices I am missing, but this is for general code structure.
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.