使用带有一个附加参数的函数的map()进行JS回调

时间:2012-06-03 17:20:37

标签: javascript arrays map parameters callback

我试图找到一种方法来使用JS的Array.prototype.map()功能,并使用一个附加参数更多的功能(如果可能的话,我想要<\ n)< em>避免必须重写内置Array.prototype.map())。 这个文档非常好,但不包括&#34;一个或多个附加参数&#34;情况下:

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

到目前为止,这么好。 但是,如果所讨论的函数具有两个参数,例如e。 G。你可能想要的一个标志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 个答案:

答案 0 :(得分:18)

使用匿名函数:

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

答案 1 :(得分:15)

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

theFlag将是第一个参数:

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

答案 2 :(得分:1)

使用匿名函数。

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

答案 3 :(得分:1)

编辑:没关系,你真的不需要Closure。见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);
}

在这种特殊情况下,我可能不会推荐这种方法,但可能会出现类似的情况。