2012-06-03 9 views
6

Próbuję znaleźć sposób użycia funkcji JS Array.prototype.map() z funkcją, która ma jeden dodatkowy parametr więcej (jeśli to możliwe, i chciałbym do uniknięcia konieczności dodania do wbudowanego wbudowanego Array.prototype.map()). Dokumentacja ta jest bardzo dobra, ale nie obejmuje "jeden lub-bardziej-dodatkowy parametr" przypadek:Wywołanie zwrotne JS za pomocą mapy() z funkcją, która ma jeden dodatkowy parametr

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 

Tak daleko, tak dobrze. Ale co, jeśli dana funkcja ma dwa parametry, np. E. sol. Flaga może chcesz lub je (myśleć bitowych masek)

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! 

Wszelkie rozwiązania należy zrobić bezfor pętli, oczywiście, bo to dlaczego mamy map(), aby nasz kod czyszczący w/uzyskiwanie pozbądź się tych!

Odpowiedz

17

Użyj anonimową funkcję:

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

+1, zrealizowany po zaksięgowaniu mojej odpowiedzi :) – SuperSaiyan

+0

TY! To najprawdopodobniej będzie jedynym sposobem na pokrycie tego zadania (poza bind()). Podziękowania dla innych osób udzielających odpowiedzi. – syntaxerror

1

użycie anonimowego funkcji.

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

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

theFlag będzie pierwszym argumentem choć:

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

+0

Uwielbiam tę technikę bind(), dzięki! – syntaxerror

1

Edycja: Nevermind, naprawdę nie potrzeba zamknięcia do tego. Zobacz odpowiedź Esailiji.

Istnieje inna opcja, jeśli używasz Closure library. Najpierw trzeba przepisać doOpSingle2 tak, że flaga jest pierwszy:

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

wtedy można zrobić

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

goog.partial częściowo dotyczy funkcję, więc goog.partial(doOpSingle2, theFlag) jest równoznaczne z tej funkcji:

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

W tym konkretnym przypadku prawdopodobnie nie zaleciłbym tego podejścia, ale może być podobna sytuacja s gdzie to działa dobrze.

+1

javascript może już robić curry z '.bind' chociaż – Esailija

+0

TO jest bardzo problem. Byłoby po prostu przesadą używać zewnętrznej biblioteki do tego małego problemu. Ale mimo wszystko, dzięki za to podejście. W realnym dużym projekcie, może potrzebuję tej techniki kiedyś. ;) – syntaxerror

+0

Dlatego powiedziałem "jeśli zdarzy ci się używać zamknięcia" zamiast "powinieneś upuścić wszystko teraz i zacząć używać Zamknięcia" sposób [niektórzy ludzie] (http://meta.stackexchange.com/a/ 19492/65977);). – MatrixFrog

Powiązane problemy