Search code examples
javascriptforeachargumentsexploded

Javascript explode object to arguments


Is there some way to make the following work in javascript?

var orders = [
   {milk: true, sugar: "extra"}, 
   {milk: false, sugar: "normal"}
   ];

function makeCoffee(sugar, milk) {
    console.log(sugar);
    console.log(milk);
}

orders.forEach(makeCoffee);

Solution

  • As I said in my comment, in browsers where func.toString() returns the source of the function , you could parse the signature and extract the parameter names:

    var arg_names = makeCoffee.toString()
                .match(/function[^(]*\(([^)]*)\)/)[1].split(', ');
    
    orders.each(function(order) {
        makeCoffee.apply(null, arg_names.map(function(name) {
            return order[name];
        });
    });
    

    Since JavaScript does not provide any reflection API, this is probably the only way.


    If you don't explicitly state in which browsers your code is supported, this might not work (I don't know what IE returns for func.toString). I still recommend to pass an object as argument.


    †: The exact representation of the function is implementation dependent though. Here is the corresponding description from the specification:

    An implementation-dependent representation of the function is returned. This representation has the syntax of a FunctionDeclaration. Note in particular that the use and placement of white space, line terminators, and semicolons within the representation String is implementation-dependent.