在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
答案 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]);
答案 2 :(得分:1)
这是因为String.prototype.toUpperCase
在this
(上下文)对象上运行,但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)
其中A
是a
元素的类,而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
方法都忽略了它,例如length
和map
。
答案 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']