在IE8中是否支持JavaScript的.map()函数?

36

当进行以下操作时:

var a = new Array("a", "b");
a.map(function() { });

在IE8中,我得到了以下错误:
"Object doesn't support this property or method"

这种方法在IE8中不受支持,还是我有其他问题?我在Google上搜索,但得到了很多有关Google地图JavaScript的问题和疑问...
编辑:好的,所以IE8及以下版本不支持.map()函数。从MDN网站这里复制粘贴代码,如果没有本地支持,则将.map()函数添加到数组原型中,完全符合规范(而且似乎完美运行)。
5个回答

45

解决方案是使用 jQuery.map

不要这样写: a.map(function( ) { });

你需要这样写:

jQuery.map(a, function( ) { //无论你想做什么.. }


太完美了,简直不敢相信我错过了这个。你是最棒的,谢谢!这也应该是被采纳的答案。上面那个毫无用处。 - Mark Pieszak - Trilon.io
6
有用,但不应该作为其他人所说的接受答案。没有人说原帖的作者在使用jQuery,而且jQuery并不是答案的万能钥匙。 - Robin van Baalen
2
抱歉对作者说,我要给这个点踩,因为“jQuery 神奇地解决了一切”已经成为我经常看到的口头禅,我厌倦了人们依赖它来做任何事情。学习 JavaScript,而不是 jQuery!Justin 在他的答案中提供了 MDN 链接,那里的 polyfill 完全可以正常工作,而不依赖于笨重的第三方库。 - pospi

40

IE8不支持map()。如果有疑问,请查看MDN(Mozilla开发者网络):

map - MDN

看起来IE在第9版中添加了对map()的支持。


我发现兼容性脚本也很有用。 - Gábor Lipták
有没有 map() 的替代方案?我的网站大部分用户使用IE8..而我在代码中使用了map(),现在该怎么办?(注:我使用jquery) - Shafizadeh
@Shafizadeh - 如果您访问我发布的链接,您将会看到MDN提供了一个Polyfill,它可以让您在IE8中使用map方法。 - Justin Niessner

22
(function(fn){
    if (!fn.map) fn.map=function(f){var r=[];for(var i=0;i<this.length;i++)r.push(f(this[i]));return r}
    if (!fn.filter) fn.filter=function(f){var r=[];for(var i=0;i<this.length;i++)if(f(this[i]))r.push(this[i]);return r}
})(Array.prototype);

在第一个.map或.filter调用之前放置任何地方即可解决问题。jQuery.map()方法的效果不如预期。

更新: 我刚刚在稀疏数组上进行了测试:如果map或filter参数是一个接受和处理undefined值的函数-它可以工作,但结果并不明显:

让我们定义一个测试稀疏数组:

var t = []
t[1] = 1; t[3] = 3; t[5] = 5;

让我们看看IE8对t的解释: "[undefined, 1, undefined, 3, undefined, 5]"

让我们尝试一下:

t.filter(function(x){return x<4})

什么是IE8?它是: "[1, 3]"。注意 - 没有未定义的值。我个人会期望这样。
但是试试这个:
t.map(function(x){return 2<<x})

还有一个奇怪的东西!"[2, 4, 2, 16, 2, 64]"。:) 尝试这个:

t.map(function(x){return Math.pow(2,x)})

那么呢?... "[NaN, 2, NaN, 8, NaN, 32]" - 我更倾向于在之前的测试中得到这样的结果。这至少是合乎逻辑的 - Math.pow() 应该返回一个 number 类型,NaN 就是一种特殊的 number 类型,用于无效操作。因此,结果或多或少是正确的。如果 t 仍然是一个稀疏数组,则 map 的结果将完全正确。

所以,不再做过多解释 - mapfilter 方法的最终正确版本

(function(fn){
    if (!fn.map) fn.map=function(f){var r=[];for(var i=0;i<this.length;i++)if(this[i]!==undefined)r[i]=f(this[i]);return r}
    if (!fn.filter) fn.filter=function(f){var r=[];for(var i=0;i<this.length;i++)if(this[i]!==undefined&&f(this[i]))r[i]=this[i];return r}
})(Array.prototype);

And the test:

var t = []; t[1] = 1; t[3] = 3; t[5] = 5;
var t1 = t.map(function(x){return 2<<x});
var t2 = t.filter(function(x){return x<10});
console.debug(t);
console.debug(t1);
console.debug(t2);

期望结果:

[对象 数组] [未定义, 1, 未定义, 3, 未定义, 5]

[对象 数组] [未定义, 4, 未定义, 16, 未定义, 64]

[对象 数组] [未定义, 1, 未定义, 3, 未定义, 5]


喜欢它。更好的解决方案! - Mark Pieszak - Trilon.io
reduce 的 polyfill 是什么? - przemo_li

7

MDN表示IE 9支持它,但未提及IE 8。

enter image description here


0

在 MSDN 上,关于地图的要求中指出: 不支持以下文档模式:Quirks、Internet Explorer 6 标准、Internet Explorer 7 标准、Internet Explorer 8 标准。

Map 只是数组“访问者”模式的一种实现。 因此,易于替代它的方法是:

function visitArray(arr, visitor) {
    var result = [];

    for (var i = 0; i < arr.length; i ++) {
        result[i] = visitor(arr[i]);
    }

    return result;
}

该函数还接受数组和函数,用于在每个数组元素上调用。它返回一个新的数组,其中包含每个原始数组元素的访问者调用结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接