如何将JavaScript数组转换为函数
问题描述:
我有一个任意值的数组。我写了一个将数组转换为返回原始值的函数数组的函数,所以不用调用[3],而是调用a3。如何将JavaScript数组转换为函数
这是我的代码不起作用? 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]());
答
其他人已经回答了你的问题,而我在写我的,但我无论如何都会发布它 - 这可能是比较容易跟着没有所有这些弹出和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;
}
(我也改变了硬编码长度从numToFunLength到numTo.length所以变换()函数将用于其它输入不是仅全局变量numToFun工作。)
参见DEMO。
UPDATE:更优雅的方式使用Sugar库做到这一点:
function transform(array) {
return array.map(function (v) {
return function() {
return v;
}
});
}
我喜欢这种语法,因为它使得它更明确要值的数组映射到一个数组函数返回这些值。
参见DEMO。
答
您的功能transform
不返回任何内容。这就是为什么b
是undefined
。
return numTo;
在另一方面,所述阵列将被传递给函数为反正参考,所以原来的阵列将被改变。如果您不返回任何内容,则不会出现问题,只需省略var b = transform(numToFun);
一行,然后直接写入transform(numToFun)
即可。
答
你的转换函数没有返回任何东西。所以B是未定义
从我+1,肯定更简单,更清洁。甚至原始数组也被保留下来! – kapa 2012-07-24 09:19:02
这是否是有效的方法?我的意思是它更快地改变我的解决方案? – 2619 2012-07-24 09:22:12
@ al0ne晚上:好吧,如果你问我,阅读速度肯定会更快。 ;)除此之外,我无法想象任何两种解决方案的速度差异都会显着的用例。我总是建议从最易读的方式开始编写代码,并且只考虑在分析代码时以及代码真正重要时优化代码的速度。现在,当我想到它时,我可能会在几分钟内发布更优雅的解决方案。 – rsp 2012-07-24 09:36:32