9

私は JS の機能を、もう 1 つの追加パラメーターを持つ関数で使用する方法を見つけようとしていますArray.prototype.map()(可能であれば、組み込みを書き直す必要はありません)。このドキュメントは非常に優れていますが、「1 つ以上の追加パラメーター」のケースはカバーしていません。Array.prototype.map()

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 つのパラメーターがある場合、たとえばフラグのように、OR したい場合はどうでしょう (ビット マスクを考えてください)。

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!

もちろん、すべてのソリューションはループなし forで行う必要があります。なぜなら、map()これらを取り除くことでコードをよりクリーンにする必要があるからです!

4

4 に答える 4

20

無名関数を使用します。

A.map(function(a) {return doOpSingle2(a,theFlag);});
于 2012-06-03T17:22:02.427 に答える
14

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

theFlagただし、最初の引数になります。

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

于 2012-06-03T17:27:18.253 に答える
1

編集:気にしないでください。これには Closure は必要ありません。Esailija の回答を参照してください。

Closure ライブラリを使用している場合は、別のオプションがあります。まず、フラグが最初になるように 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);
}

この特定のケースでは、おそらくこのアプローチはお勧めしませんが、うまく機能する同様の状況があるかもしれません。

于 2012-06-03T17:29:50.457 に答える
1

無名関数を使用します。

var y = A.map(function(x){doOpSingle2(x,theFlag);});
于 2012-06-03T17:23:05.463 に答える