2012-07-24 53 views
3

我有一個任意值的數組。我寫了一個將數組轉換爲返回原始值的函數數組的函數,所以不用調用[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]());​ 

回答

4

其他人已經回答了你的問題,而我在寫我的,但我無論如何都會發布它 - 這可能是比較容易跟着沒有所有這些彈出和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

1

您的功能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

1

你的轉換函數沒有返回任何東西。所以B是未定義