IE8是否支持javascript .map()函数?

Ric*_*d H 35 javascript map internet-explorer-8

这样做时:

var a = new Array("a", "b");
a.map(function() { });
Run Code Online (Sandbox Code Playgroud)

在IE8中,我得到:

"Object doesn't support this property or method"
Run Code Online (Sandbox Code Playgroud)

IE8中不支持此方法,还是有其他问题?我有一个谷歌,但获得了很多谷歌地图的JavaScript问题/问题......

编辑:确定IE8及以下版本不支持.map()函数.将代码从MDN复制粘贴在这里将完全.MAP()函数添加到阵列中每个原型的规格,如果没有原生支持(它似乎很好地工作).

小智 43

解决方案是jQuery.map

而不是这个: a.map(function( ) { });

你必须做

jQuery.map(a, function( ) { //what ever you want todo .. }

  • 这很有用,但不应该像其他人所说的那样成为公认的答案.没有人说OP使用的是jQuery,而jQuery并不能解决所有问题. (5认同)
  • 谢谢!这应该包含在例外答案中. (2认同)
  • 向作者道歉,但我要打赌这是因为"jQuery神奇地修复了所有东西"已经成为我看到很多的口头禅,而我却厌倦了依赖它的所有人......学习JavaScript,而不是jQuery![Justin](http://stackoverflow.com/a/7350935/141881)在他的回答中提供了MDN链接,并且那里的polyfill完美地运行,而不依赖于重量级的第三方库. (2认同)

Jus*_*ner 40

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

地图 - MDN

看起来IE map()在版本9中添加了支持.


Har*_*rry 21

(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);
Run Code Online (Sandbox Code Playgroud)

在第一个.map或.filter调用之前放置任何位置.问题解决了.jQuery.map()方法无法按预期工作.

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

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

var t = []
t[1] = 1; t[3] = 3; t[5] = 5;
Run Code Online (Sandbox Code Playgroud)

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

我们试试吧:

t.filter(function(x){return x<4})
Run Code Online (Sandbox Code Playgroud)

是什么,IE8?它是:"[1,3]".注意 - 没有未定义的值.我个人希望如此.

但试试这个:

t.map(function(x){return 2<<x})
Run Code Online (Sandbox Code Playgroud)

而且...... "[2,4,2,16,6,64]".那真是怪了!:) 试试这个:

t.map(function(x){return Math.pow(2,x)})
Run Code Online (Sandbox Code Playgroud)

并且?... "[NaN,2,NaN,8,NaN,32]" - 我宁愿期望这个结果用于之前的测试.它至少是逻辑的 - Math.pow()应该返回一个number类型NaN,不管它是什么意思,IS是number为无效操作保留的特殊类型.所以结果或多或少是正确的.map如果t仍然是稀疏数组,则结果完全正确.

所以没有进一步的麻烦 - 最终正确的版本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);
Run Code Online (Sandbox Code Playgroud)

而且测试:

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);
Run Code Online (Sandbox Code Playgroud)

预期成绩:

[object Array] [undefined,1,undefined,3,undefined,5]

[object Array] [undefined,4,undefined,16,undefined,64]

[object Array] [undefined,1,undefined,3,undefined,5]


Viv*_*ath 7

MDN表示IE 9支持它.没有提到IE 8.

在此输入图像描述