Javascript映射本机对象方法

时间:2010-11-12 18:28:58

标签: javascript functional-programming

在Python中,你可以这样:

>>> list(map(str.upper, ['foo','bar']))
['FOO', 'BAR']

我希望能够在javascript中执行类似的操作:

我在Chrome中使用原生地图实现(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map)尝试了以下内容:

['foo','bar'].map(String.prototype.toUpperCase)

['foo','bar'].map(String.prototype.toUpperCase.call)

为什么不打电话? 有没有优雅的方法来做到这一点,还是我必须在回调函数中包装toUpperCase? THX

5 个答案:

答案 0 :(得分:2)

尝试:

['foo','bar'].map(Function.prototype.call.bind(String.prototype.toUpperCase))

或同样的效果:

['foo','bar'].map(Function.call.bind("".toUpperCase))

JavaScript对this的处理是一次糟糕的旅程。

答案 1 :(得分:1)

现代浏览器支持此功能(although it is a recent addition

var a = ['foo','bar'];
var b = a.map(String.toUpperCase);

alert(b[1]);

甚至

var a = ['foo','bar'].map(String.toUpperCase);
alert(a[0]);

示例:http://www.jsfiddle.net/xPsba/

答案 2 :(得分:1)

这是因为String.prototype.toUpperCasethis(上下文)对象上运行,但map函数无法将数组元素设置为上下文。它将它作为参数传递。解决方法是

['foo','bar'].map(function(k) { return String.prototype.toUpperCase.call(k) });

答案 3 :(得分:1)

你们都错过了这一点。 : - )

我们想在数组的所有元素上调用方法(不是函数)。您可以使用map

a.map(function(x){x.frob()})

但打字太多了。我们想说:

a.mapm(A.frob)

其中Aa元素的类,而mapm是一个新的Array方法,它在this的每个元素上调用其参数方法(在这种情况下为数组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方法都忽略了它,例如lengthmap

答案 4 :(得分:-1)

您可以使用以下内容:

function map(arr, fn){
    var i = 0, len = arr.length, ret = [];
    while(i < len){
        ret[i] = fn(arr[i++]);
    }
    return ret;
}

使用它:

var result = map(['foo', 'bar'], function(item) {
    return item.toUpperCase();
});

console.log ( result ); // => ['FOO', 'BAR']