Converting an array to a function arguments list
JavascriptArraysArgumentsJavascript Problem Overview
Is it possible to convert an array in JavaScript into a function argument sequence? Example:
run({ "render": [ 10, 20, 200, 200 ] });
function run(calls) {
var app = .... // app is retrieved from storage
for (func in calls) {
// What should happen in the next line?
var args = ....(calls[func]);
app[func](args); // This is equivalent to app.render(10, 20, 200, 200);
}
}
Javascript Solutions
Solution 1 - Javascript
Yes. In current versions of JS you can use:
app[func]( ...args );
Users of ES5 and older will need to use the .apply()
method:
app[func].apply( this, args );
Read up on these methods at MDN:
-
[.apply()][1]
-
[spread "..." operator][2] (not to be confused with the related [rest "..." parameters][3] operator: it's good to read up on both!)
[1]: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/apply "apply" [2]: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_operator#A_better_apply "spread operator" [3]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters "rest parameters operator"
Solution 2 - Javascript
A very readable example from another post on similar topic:
var args = [ 'p0', 'p1', 'p2' ];
function call_me (param0, param1, param2 ) {
// ...
}
// Calling the function using the array with apply()
call_me.apply(this, args);
And here a link to the original post that I personally liked for its readability
Solution 3 - Javascript
app[func].apply(this, args);
Solution 4 - Javascript
You might want to take a look at a similar question posted on Stack Overflow. It uses the .apply()
method to accomplish this.
Solution 5 - Javascript
@bryc - yes, you could do it like this:
Element.prototype.setAttribute.apply(document.body,["foo","bar"])
But that seems like a lot of work and obfuscation compared to:
document.body.setAttribute("foo","bar")