Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert javascript array to function

I have an array of arbitrary values. I Wrote a function that transforms the array to an array of functions that return the original values, so instead of calling a[3], I will call a3.

Here is my code which does not work? code. It gives this error Cannot call method '1' of undefined.

var numToFun = [1, 2, { foo: "bar" }];
var numToFunLength = numToFun.length;

function transform(numTo) {
    for (var i = 0; i < numToFunLength; i++) {
        (function(num){
            numTo.unshift(function() {
                return num;
            });
        }(numTo.pop())) 
    }
}

var b = transform(numToFun);

console.log(numToFun);
console.log(b[1]());​
like image 263
Om3ga Avatar asked Mar 23 '26 09:03

Om3ga


2 Answers

Others have already answered your question while I was writing mine but I will post it anyway - this may be somewhat easier to follow without all of those popping and unshifting:

function transform(numTo) {
    var r = [];
    for (var i = 0; i < numTo.length; i++) {
        r[i] = (function (v) {
            return function() {
                return v;
            }
        }(numTo[i]));
    }
    return r;
}

(I have also changed the hard-coded length from numToFunLength to numTo.length so the transform() function would work for other inputs than only the global numToFun variable.)

See DEMO.

UPDATE: even more elegant way to do it using the Sugar library:

function transform(array) {
    return array.map(function (v) {
        return function() {
            return v;
        }
    });
}

I like this syntax because it makes it more explicit that you want to map an array of values to an array of functions that return those values.

See DEMO.

like image 117
rsp Avatar answered Mar 24 '26 22:03

rsp


Your function transform does not return anything. That is why b is undefined.

return numTo;

jsFiddle Demo

On the other hand, the array will be passed to the function as a reference anyways, so the original array will be changed. It is not a problem if you don't return anything, just omit the var b = transform(numToFun); line and simply write transform(numToFun).

like image 39
kapa Avatar answered Mar 24 '26 23:03

kapa



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!