Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
185
rated 0 times [  186] [ 1]  / answers: 1 / hits: 19627  / 7 Years ago, tue, august 29, 2017, 12:00:00

I am trying to map values to a function that will accept two numbers to multiply but am having trouble doing so (if this doesn't make sense, take a look at the examples below).



I have an array of numbers and I would like to double/triple/quadruple... the values of this array. I have created functions that would do this, and am feeding these double() and triple() into map().



var arr = [1, 2, 3, 4, 5];

function double(num) {
return num * 2;
}

function triple(num) {
return num * 3;
}

console.log( arr.map(double) );
console.log( arr.map(triple) );


This solution is not scalable as what if I want to multiply the values by 5, or 10? I need a more abstract function that would take a parameter of what to multiply. I am confused about how to do this. My attempt so far is:



var arr = [1, 2, 3, 4, 5];

function multiply(num, multiplyBy) {
return num * multiplyBy;
}

console.log( arr.map(multiplyBy(4) ); // Uncaught TypeError: NaN is not a function


How would I pass multiply() the multiplyBy parameter?


More From » javascript

 Answers
23

You can do something called a factory currying. Effectively, you make a function that will return another function which is tailored to your needs. In this case, an anonymous one.



var arr = [1, 2, 3, 4, 5];

function multiplyBy(scale) {
return function(num){
return num * scale;
}
}

console.log( arr.map( multiplyBy(4) ));


This works because the scope of the anonymous function that is returned is within that of the factory outer function. So, whenever we produce a new function, it will retain the value of scale that was given for its production.



Edit: The last part of @Bergi 's answer is the same as mine. The concept is apparently called currying. Thanks @Bergi ! The Factory pattern is more often applied to the production of objects, as Bergi noted, but it was the only thing I could think of at the time, and javascript sort of treats functions like objects. In this specific case, they are effectively similar. Here is a good reference for currying in JavaScript


[#56639] Thursday, August 24, 2017, 7 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
robertjaysona

Total Points: 276
Total Questions: 110
Total Answers: 116

Location: Finland
Member since Sat, Nov 6, 2021
3 Years ago
;