如何将原型上定义的方法传递给Array.map作为回调

时间:2015-10-08 03:41:48

标签: javascript arrays prototype

我有一个数组

var arr = [' A ', ' b ', 'c'];

我希望trim来自数组中每个元素的空格。

可以使用Array.map作为

来完成
arr.map(function(el) {
    return el.trim();
});

我很好奇将trim / toLowerCase函数直接传递给map作为回调函数,例如arr.map(Math.max.apply.bind(Math.max, null));以获取每个子数组的最大元素或arr.map(Number);将每个元素转换为数字。

我已经尝试了

arr.map(String.prototype.trim.apply);

但是它正在抛出错误

  

未捕获的TypeError:在undefined上调用了Function.prototype.apply,这是一个未定义的而不是函数

我希望应该为数组中的每个元素调用String.prototype.trim.apply,并将上下文设置为数组中的元素(传递给apply);

我还尝试了applycallbind的不同组合,但没有成功。

  1. 为什么使用map时无法引用原型上的函数
  2. 如何将功能作为参数传递给map

2 个答案:

答案 0 :(得分:6)

arr.map(String.prototype.trim.call.bind(String.prototype.trim));

call在内部使用this,在这种情况下必须指向trim函数才能正常工作。只需传递String.prototype.trim.call即可将call未绑定到任何方法,从而导致this值指向window

  

它可以工作,但是当使用apply而不是call时它抛出错误,   arr.map(String.prototype.trim.apply.bind(String.prototype.trim));

问题是map将传递2个参数,即项目和索引。因此,它最终会调用类似'String.prototype.trim.apply('test', 0)的内容,因为第二个参数必须是数组才会失败。

  

还有一件事[' A',' B',   ' C']图(String.prototype.trim.call.bind(String.prototype.toLowerCase));,   在这里,我使用了trim.call并将其作为上下文传递给了LowCase   为什么我们需要修剪这里,为什么修剪不被称为

使用call.bind时,您选择访问call函数引用的路径变得无关紧要。将被调用的函数是绑定的函数。

如果你想要一起组合功能,你需要一个不同的方法:

var call = Function.prototype.call,
    trim = call.bind(String.prototype.trim),
    toLowerCase = call.bind(String.prototype.toLowerCase),
    trimAndLowerCase = pipelineFrom(trim, toLowerCase);

[' TeST '].map(trimAndLowerCase);

function pipelineFrom(fn1, fn2) {
    return function (val) {
        return fn2(fn1(val));
    };
}

但是此时你最好还是选择:

arr.map(function (val) {
    return val.trim().toLowerCase();
});

答案 1 :(得分:2)

这很有效,但肯定是啰嗦:

var t = String.prototype.trim.call.bind(String.prototype.trim);
arr.map(t);

因为它已经长途跋涉,blog postsmodules致力于解散,这就是你要在这里做的事情。

我曾在ask about this做过一次......