Reputation: 179
I believe I have solved this problem but having an issue only passing 1 parameter to my final function to return result. Here is the question
For instance, consider the function getDouble. When run twice on value 3, yields 12 as shown below.
getDouble(3) => 6
getDouble(6) => 12
Let us name the new function createIterator and we should be able to obtain the same result using createIterator as shown below:
var doubleIterator = createIterator(getDouble, 2); // This means, it runs *getDouble* twice
doubleIterator(3) => 12
For the sake of simplicity, all function inputs to createIterator would be functions returning a small number and number of iterations would always be integers.
Here is my answer:
function getDouble(num){
newNum = num * 2
return newNum
}
var createIterator = function (func, n) {
var results = [];
var result;
result = func;
results.push(func);
for(var i = 0;i < n - 1; i++){
results.push(results[i] * 2);
}
return results;
};
// var doubleIterator = createIterator(getDouble(3),2).slice(-1).pop();
Here is the function that I am trying to make to have only 1 call. Everything is working properly above but I must be able to submit this entire response only passing one parameter this this function:
function doubleIterator(d){
// var n;
// createIterator.call(this,n)
return createIterator(getDouble(d),n).slice(-1).pop();
}
console.log(doubleIterator);
Upvotes: 1
Views: 546
Reputation: 350290
You could use this definition of createIterator:
function createIterator(func, n) {
return function (arg) {
for (var i = 0; i < n; i++) arg = func(arg);
return arg;
};
}
function getDouble(num){
return num * 2;
}
var doubleIterator = createIterator(getDouble, 2);
console.log(doubleIterator(3)); // => 12
You could also write the same with reduce
and bind
:
function createIterator(func, n) {
return [].reduce.bind([...Array(n)], arg => func(arg));
}
function getDouble(num){
return num * 2;
}
var doubleIterator = createIterator(getDouble, 2);
console.log(doubleIterator(3)); // => 12
Although shorter code, it is a bit obscure. It binds this
and the first argument of reduce
as follows:
this
: an empty array of n elements, which dictates how many times the callback function (i.e. the second argument, see below) is called. The actual values in the array are not important, as the callback function being used ignores them:
callback function arg => func(arg)
: will be called n times when the reduce
is actually invoked (which does not happen here yet). Although the callback function could accept the array value as second argument, there is no interest to do so.
The third argument is left unbound, and determines the initial value with which the callback function will be called the first time. So createIterator
returns a variant of reduce
that accepts only one argument, which is the initial value.
Note that there is one harmless difference compared to the first snippet: if you call the function, that is returned by createIterator
, without argument, the function func is called one time less here (with undefined
as argument, just like in the first snippet); this is because of how reduce
works when you don't pass it an initial value.
Upvotes: 2