9

我正在尝试找到一种方法来使用 JS 的Array.prototype.map()功能,该函数具有一个额外的参数(如果可能的话,我想避免重写 built-in 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

到目前为止,一切都很好。但是,如果所讨论的函数有两个参数,例如您可能想要对它进行或的标志(想想位掩码)怎么办?

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 回答