2012-06-03 8 views
6

Sto cercando un modo per utilizzare la funzionalità Array.prototype.map() di JS con una funzione che ha un parametro aggiuntivo in più (se possibile, e mi piacerebbe a evitare dovere riscrivere Array.prototype.map() incorporato. Questa documentazione è molto buona, ma non copre il caso "one-o-più-addizionale-parametro":JS callback utilizzando map() con una funzione che ha un parametro aggiuntivo

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 

Fin qui, tutto bene. Ma cosa succede se la funzione in questione ha due parametri, come e. g. una bandiera si potrebbe desiderare di OR ad esso (si pensi maschere di bit)

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! 

Tutte le soluzioni dovrebbero fare senzafor loop, naturalmente, perché è per questo che dobbiamo map(), per rendere il nostro più pulito il codice w/ricevendo liberati di questi!

risposta

17

Utilizzare una funzione anonima:

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

+1, realizzato dopo aver inviato la mia risposta :) – SuperSaiyan

+0

TY! Questo sarà probabilmente l'unico modo per coprire questo compito (tranne bind()). Grazie anche agli altri rispondenti. – syntaxerror

1

utilizzare una funzione anonima.

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

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

theFlag sarà il primo argomento però:

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

+0

Amo questa tecnica di legatura(), grazie! – syntaxerror

1

Edit: Nevermind, non si ha realmente bisogno di chiusura per questo. Vedi la risposta di Esailija.

C'è un'altra opzione, se ti capita di usare il Closure library. Prima di tutto bisogna riscrivere doOpSingle2 in modo che la bandiera è il primo:

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

allora si può fare

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

goog.partial vale parzialmente la funzione, in modo da goog.partial(doOpSingle2, theFlag) è equivalente a questa funzione:

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

In questo caso specifico, probabilmente non consiglierei questo approccio, ma potrebbe esserci una situazione simile s dove funziona bene.

+1

javascript può già eseguire la conversione con '.bind' anche se – Esailija

+0

QUESTO è il vero problema. Sarebbe semplicemente eccessivo usare una libreria esterna per questo piccolo problema. Ma comunque, grazie comunque per questo approccio. In un grande progetto _real_, potrei aver bisogno di questa tecnica un giorno. ;) – syntaxerror

+0

Ecco perché ho detto "se ti capita di usare Closure" invece di "dovresti rilasciare tutto adesso e iniziare a usare Closure" come fanno [alcune persone] (http://meta.stackexchange.com/a/ 19492/65977);). – MatrixFrog

Problemi correlati