2012-06-03 14 views
6

JSのArray.prototype.map()機能を追加のパラメータが1つ多い関数で使用する方法を見つけようとしています(可能であれば、 を避けるを組み込み、Array.prototype.map()を書き直す必要がありません。 このドキュメントは非常に良いですが、 "1-または-以上-追加のパラメータ" ケースをカバーしていない:map()を使用して1つの追加パラメータを持つ関数を使用した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 

これまでのところ、とても良いです。 しかし、問題の関数がの2つのパラメータを持っているとしたらどうでしょうか? g。私たちは、コードクリーナーをwを作るために、map()を持っている理由ですので、フラグあなたが取得/、どれソリューションはもちろん、forループなしを行う必要があります

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! 

を(ビットマスクと考える)にするかしたい場合がありますこれらを取り除く!

答えて

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

これは非常に問題ですが、javascriptはすでに '.bind'でカリングしています。 – Esailija

+0

この小さな問題のために外部ライブラリを使用するのは難しいことです。しかし、とにかくこのアプローチのおかげでまだ。 _real_大きなプロジェクトでは、私はいつかこの技術が必要かもしれません。 ;) – syntaxerror

+0

だから、「あなたが今すぐすべてを落として、閉鎖を使うべきではない」(「何人かの人たちが行う方法」)(http://meta.stackexchange.com/a/ 19492/65977);)。 – MatrixFrog

関連する問題