如何将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

+0

从我+1,肯定更简单,更清洁。甚至原始数组也被保留下来! – kapa 2012-07-24 09:19:02

+0

这是否是有效的方法?我的意思是它更快地改变我的解决方案? – 2619 2012-07-24 09:22:12

+1

@ al0ne晚上:好吧,如果你问我,阅读速度肯定会更快。 ;)除此之外,我无法想象任何两种解决方案的速度差异都会显着的用例。我总是建议从最易读的方式开始编写代码,并且只考虑在分析代码时以及代码真正重要时优化代码的速度。现在,当我想到它时,我可能会在几分钟内发布更优雅的解决方案。 – rsp 2012-07-24 09:36:32

您的功能transform不返回任何内容。这就是为什么bundefined

return numTo; 

jsFiddle Demo

在另一方面,所述阵列将被传递给函数为反正参考,所以原来的阵列将被改变。如果您不返回任何内容,则不会出现问题,只需省略var b = transform(numToFun);一行,然后直接写入transform(numToFun)即可。

+0

感谢它现在工作。你能告诉我这是实现我想实现的一个好方法吗? – 2619 2012-07-24 09:11:04

+0

@ al0neevenings好吧,似乎它的作品。肯定:)的一个棘手的方式。 – kapa 2012-07-24 09:14:30

你的转换函数没有返回任何东西。所以B是未定义