2012-06-03 21 views
6

Estoy tratando de encontrar una forma de usar la funcionalidad Array.prototype.map() de JS con una función que tiene un parámetro adicional más (si es posible, y me gustaría a evite teniendo que reescribir el Array.prototype.map() incorporado). Esta documentación es muy buena, pero no cubre el caso de "una o más-adicional-parámetro":Devolución de llamada JS usando map() con una función que tiene un parámetro adicional

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 

Hasta ahora, todo bien. Pero, ¿y si la función en cuestión tiene dos parámetros, como e. gramo. una bandera es posible que desee O a él (pensar en máscaras de bits)

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! 

Cualquier solución debe hacer sinfor bucles, por supuesto, porque es por eso que tenemos map(), para hacer nuestro código más limpio w/conseguir deshacerse de estos!

Respuesta

17

utilizar una función anónima:

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

+1, realizado después de publicar mi respuesta :) – SuperSaiyan

+0

TY! Probablemente esta sea la única forma de cubrir esta tarea (aparte de bind()). Gracias a los otros respondedores también. – syntaxerror

1

utilizar una función anónima.

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

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

theFlag habrá primer argumento sin embargo:

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

+0

Me encanta esta técnica bind(), gracias! – syntaxerror

1

Editar: No importa, que realmente no necesita Cierre para esto. Ver la respuesta de Esailija.

Hay otra opción, si está usando el Closure library. En primer lugar tiene que volver a escribir doOpSingle2 por lo que la bandera es primero:

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

entonces puede hacer

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

goog.partial aplique parcialmente la función, por lo goog.partial(doOpSingle2, theFlag) es equivalente a esta función:

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

En este caso particular, probablemente no recomendaría este enfoque, pero podría haber una situación similar s donde funciona bien

+1

javascript ya puede hacer currying con '.bind' aunque – Esailija

+0

ESTE es el problema. Sería excesivo usar una biblioteca externa para este pequeño problema. Pero aún así, gracias de todos modos por este enfoque. En un gran proyecto real, podría necesitar esta técnica algún día. ;) – syntaxerror

+0

Es por eso que dije "si estás usando Closure" en lugar de "deberías dejar todo en este momento y comenzar a utilizar Closure" de la forma en que lo hacen [algunas personas] (http://meta.stackexchange.com/a/ 19492/65977);). – MatrixFrog

Cuestiones relacionadas