Javascript映射本机对象方法

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中执行类

在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中执行类似的操作:

我在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
方法,该方法对
的每个元素调用其参数方法(在本例中为Array
A
)。您可以这样定义
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 sure
for
更简单,但显然更传统;)@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"]