2012-06-03 4 views
6

Ich versuche einen Weg zu JS Array.prototype.map() Funktionalität mit einer Funktion zu finden, die einen zusätzlichen Parameter mehr (wenn überhaupt, und ich möchte zu vermeiden Sie, die eingebautes Array.prototype.map() neu schreiben müssen). Diese Dokumentation ist sehr gut, aber nicht deckt den "Ein-oder-mehr-Zusatzparameter" Fall:JS Callback mit map() mit einer Funktion, die einen zusätzlichen Parameter hat

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 

So weit, so gut. Aber was ist, wenn die betreffende Funktion zwei Parameter hat, wie e. G. ein Flag möchten Sie vielleicht oder, um es (man denke an Bitmasken)

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! 

Alle Lösungen ohnefor Schleifen, natürlich tun sollten, denn das ist, warum wir map() haben, unseren Code sauberer zu machen w/getting los von diesen!

Antwort

17

eine anonyme Funktion verwenden:

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

+1, realisiert nach dem Posten meiner Antwort :) – SuperSaiyan

+0

TY! Dies wird wahrscheinlich die einzige Möglichkeit sein, diese Aufgabe abzudecken (abgesehen von bind()). Danke auch an die anderen Beantworter. – syntaxerror

1

eine anonyme Funktion verwenden.

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

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

theFlag wird allerdings erste Argument sein:

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

+0

Liebe diese Bindung() Technik, danke! – syntaxerror

1

Edit: Nevermind, die Sie nicht wirklich Closure dafür brauchen. Siehe die Antwort von Estagija.

Es gibt eine andere Option, wenn Sie die Closure library verwenden. Zuerst müssen Sie doOpSingle2 neu zu schreiben, so dass die Fahne erste ist:

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

dann können Sie tun

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

goog.partial teilweise die Funktion gilt, so goog.partial(doOpSingle2, theFlag) entspricht diese Funktion:

In diesem speziellen Fall würde ich diesen Ansatz wahrscheinlich nicht empfehlen, aber es könnte ähnliche Situation geben s, wo es gut funktioniert.

+1

Javascript kann schon currying mit '.bind' obwohl – Esailija

+0

Dies ist das Problem. Es wäre einfach übertrieben, eine externe Bibliothek für dieses kleine Problem zu verwenden. Trotzdem, danke trotzdem für diesen Ansatz. In einem wirklich großen Projekt könnte ich diese Technik irgendwann brauchen. ;) – syntaxerror

+0

Deshalb habe ich gesagt "wenn du Closure benutzt" anstelle von "du solltest jetzt alles fallen lassen und Closure benutzen" so wie manche Leute es tun (http://meta.stackexchange.com/a/ 19492/65977);). – MatrixFrog

Verwandte Themen