Javascript映射本机对象方法
在Python中,您可以执行以下操作:Javascript映射本机对象方法,javascript,functional-programming,Javascript,Functional Programming,在Python中,您可以执行以下操作: >>> list(map(str.upper, ['foo','bar'])) ['FOO', 'BAR'] function map(arr, fn){ var i = 0, len = arr.length, ret = []; while(i < len){ ret[i] = fn(arr[i++]); } return ret; } 我希望能够在javascript中执行类
>>> list(map(str.upper, ['foo','bar']))
['FOO', 'BAR']
function map(arr, fn){
var i = 0, len = arr.length, ret = [];
while(i < len){
ret[i] = fn(arr[i++]);
}
return ret;
}
我希望能够在javascript中执行类似的操作:
我在Chrome中使用本机映射实现()尝试了以下操作:
为什么不叫工作?
有什么优雅的方法可以做到这一点,或者我必须在回调函数中包装toUpperCase吗?
Thx您可以使用类似以下内容:
>>> list(map(str.upper, ['foo','bar']))
['FOO', 'BAR']
function map(arr, fn){
var i = 0, len = arr.length, ret = [];
while(i < len){
ret[i] = fn(arr[i++]);
}
return ret;
}
现代浏览器支持这一点() 甚至
var a = ['foo','bar'].map(String.toUpperCase);
alert(a[0]);
示例:这是因为
String.prototype.toUpperCase
在这个(上下文)对象上运行,但是map
函数不能将数组元素设置为上下文。它作为一个论点通过。解决办法是
['foo','bar'].map(function(k) { return String.prototype.toUpperCase.call(k) });
尝试:
或者为了同样的效果:
['foo','bar'].map(Function.call.bind("".toUpperCase))
JavaScript对这个的处理是一次糟糕的旅行。你们都没有抓住要点。:-)
我们希望对数组的所有元素调用方法(而不是函数)。您可以使用map
:
a.map(function(x){x.frob()})
但是打字太多了。我们想说:
a.mapm(A.frob)
其中,A
是A
的元素类,mapm
是一个新的Array
方法,该方法对此
的每个元素调用其参数方法(在本例中为ArrayA
)。您可以这样定义mapm
:
Array.prototype.mapm = function (method)
{
return this.map(function (x) { return method.apply(x) } )
};
这样称呼它:
["a", "b", "c"].mapm("".toUpperCase) ==> ["A", "B", "C"]
唯一的问题是,您在每个数组中添加了一个新元素,mapm
,尽管大多数array
方法都忽略了它,例如length
和map
您有任何示例用法吗?不过,我更愿意使用本机映射函数。它并不广泛可用。yeta for loop会简单得多:pNot surefor
更简单,但显然更传统;)@DenisHowe,在回答问题时,大多数浏览器toUpperCase中都没有本机映射函数。call
不起作用,因为call
是针对Function.prototype
解决的,因此与toUpperCase
无关。它查看this
以确定调用的是哪个方法,以及map
调用函数的方式,this
是未定义的。更好的方法是完全跳过原型部分,并将其用作['foo','bar'].map(String.toUpperCase)代码>在正确的上下文中运行。这在Firefox4中有效,但在mac上的Chrome7中无效。我想我必须将它封装在一个函数中:)这在Firefox以外的浏览器上不起作用,因为String.toUpperCase
是Mozilla的扩展,而不是ECMAScript标准的一部分(请注意,可能会错误地将其与String.prototype.toUpperCase
),他们称这些“静态”方法为“数组和字符串泛型”我真的不认为其他实现者会包括它们……您的JSFIDLE代码段正在使用MooTools,在其他浏览器上进行测试。;)+1.为了理解这一点。当然,在您的代码需要与其他代码很好地配合的情况下,修改数组的原型是有风险的,所以可能需要稍微修改一下,以允许这样的操作:a.map(method(“toUpperCase”);函数方法(m){return function(x){return x[m]();}}
Array.prototype.mapm = function (method)
{
return this.map(function (x) { return method.apply(x) } )
};
["a", "b", "c"].mapm("".toUpperCase) ==> ["A", "B", "C"]