我有一个数组
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
);
我还尝试了apply
,call
和bind
的不同组合,但没有成功。
map
时无法引用原型上的函数map
答案 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 posts和modules致力于解散,这就是你要在这里做的事情。
我曾在ask about this做过一次......