如何将JavaScript数组转换为函数

3
我有一个任意值的数组。我编写了一个函数,将该数组转换为返回原始值的函数数组,因此不再调用a[3],而是调用a3。
这是我的代码,但它无法工作?code。它会报错“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]());​
3个回答

4

在我回答时,其他人已经回答了你的问题,但我仍然会发布我的回答 - 这可能会更容易理解,不需要弹出和移位。

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;
}

我还将硬编码的长度从numToFunLength更改为numTo.length,以便transform()函数适用于除全局变量numToFun之外的其他输入。

请参见演示

更新:使用Sugar库进行更加优雅的处理方式:

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

我喜欢这个语法,因为它更明确地表示您要将一个值数组映射到返回这些值的函数数组。请参见DEMO

我给你点赞,这样做更简单、更清晰。而且原始数组也得以保留! - kapa
这种方法是否高效?我的意思是,它比我的解决方案更快吗? - Om3ga
1
@al0ne evenings: 嗯,如果你问我,那肯定更快速地阅读。 ;) 除此之外,我无法想象出任何使用情况,其中这两种解决方案的速度差异甚至能够被察觉。我总是建议从最易读的编写代码的方式开始,并且只有在你对其进行分析并且真正需要时才考虑优化其速度。现在当我在思考它时,可能会有更加优雅的解决方案,我可以在几分钟内发布。 - rsp

1

你的函数 transform 没有返回任何值。这就是为什么 bundefined

return numTo;

jsFiddle演示

另一方面,数组将作为引用传递给函数,因此原始数组将被更改。如果您不返回任何内容,则没有问题,只需省略var b = transform(numToFun);行并简单地编写transform(numToFun)即可。


谢谢,现在它可以工作了。你能告诉我这是否是实现我想要的目标的好方法吗? - Om3ga
@al0neevenings 嗯,看起来它能工作。肯定是一个棘手的方法:)。 - kapa

1

你的转换函数没有返回任何内容。因此 b 是未定义的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接