2012-06-03 75 views
6

我試圖找到一種方法來使用JS的Array.prototype.map()功能的函數,有一個額外的參數更多(如果可能的話,我想到避免不得不重寫內置的Array.prototype.map())。 本文檔是非常好的,但不包括「一個或者更多的附加參數」案例:使用地圖()與一個函數,具有一個附加參數的JS回調

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map

function doOpSingle(elem) 
{ 
// do something with one array element 
} 

var A = ["one", "two", "three", "four"]; 
var x = A.map(doOpSingle); // this will execute doOpSingle() on each array element 

到目前爲止,一切都很好。 但是,如果有問題的功能有兩個參數,如e。 G。一個標誌,你可能會想,或將其(考慮位掩碼)

function doOpSingle2(arrelem,flag) 
{ 
// do something with one array element 
} 

var A = ["one", "two", "three", "four"]; 
var theFlag = util.getMask(); // call external function 
var y = A.map(doOpSingle2(theFlag)); // this does not work! 

任何解決方案應該做沒有for循環,當然,因爲這就是爲什麼我們有map(),使我們的代碼更加清晰W /讓擺脫這些!

回答

17

可以使用匿名函數:

A.map(function(a) {return doOpSingle2(a,theFlag);}); 
+0

+1,發佈我的回答後實現:) – SuperSaiyan

+0

TY!這很可能是覆蓋此任務的唯一方法(除bind()之外)。感謝其他回答者。 – syntaxerror

1

可以使用匿名函數。

var y = A.map(function(x){doOpSingle2(x,theFlag);}); 
15

A.map(doOpSingle2.bind(null, theFlag))

theFlag會雖然第一個參數:

function doOpSingle2(flag, elem) { ... }

+0

喜歡這個bind()技術,謝謝! – syntaxerror

1

編輯:沒關係,你真的不需要關閉此。見Esailija的回答。

還有另一種選擇,如果你碰巧正在使用Closure library。首先,你必須重寫doOpSingle2而標誌是第一:

function doOpSingle2(flag, arrelem) 
{ 
// do something with one array element 
} 

那麼你可以做

var y = A.map(goog.partial(doOpSingle2, theFlag)); 

goog.partial 部分適用功能,使goog.partial(doOpSingle2, theFlag)相當於此功能:

function(arrElem) { 
    return doOpSingle2(theFlag, arrElem); 
} 

在這種特殊情況下,我可能不會推薦這種方法,但可能會有類似的情況它運作良好。

+1

雖然 – Esailija

+0

javascript已經可以用'.bind'做曲柄了,這是非常棘手的問題。使用外部庫來解決這個小問題只是矯枉過正。但仍然,非常感謝這種方法。在_real_大型項目中,我可能有一天需要這種技術。 ;) – syntaxerror

+0

這就是爲什麼我說「如果你碰巧使用Closure」而不是「你應該立即放下所有東西,並開始使用Closure」([某些人])(http://meta.stackexchange.com/a/ 19492/65977);)。 – MatrixFrog

相關問題