【问题标题】:Is the javascript .map() function supported in IE8?IE8 是否支持 javascript .map() 函数?
【发布时间】:2011-11-13 03:14:19
【问题描述】:

当这样做时:

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

在 IE8 中我得到:

"Object doesn't support this property or method"

IE8不支持这种方法,还是我有其他问题?我有一个谷歌,但得到很多谷歌地图 javascript 问题/问题...

编辑:好的,所以 IE8 及以下不支持 .map() 函数。复制粘贴来自 MDN here 的代码,如果本机不支持,它将完全按照规范将 .map() 函数添加到 Array 原型中(并且它似乎工作得很好)。

【问题讨论】:

    标签: javascript internet-explorer-8 map


    【解决方案1】:

    解决方案是jQuery.map

    取而代之的是: a.map(function( ) { });

    你必须这样做

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

    【讨论】:

    • 完美,不敢相信我错过了这个。你是男人,谢谢!这也应该是接受的答案。上面那个没用。
    • 它很有用,但不应该像其他人所说的那样被接受。没有人说 OP 使用的是 jQuery,而 jQuery 并不是万能的。
    • 向作者道歉,但我将对此投反对票,因为“jQuery 神奇地修复了一切”已成为我经常看到的一句口头禅,而且我厌倦了人们在所有事情上都依赖它。学习 JavaScript,而不是 jQuery! Justin 在他的回答中提供了 MDN 链接,并且那里的 polyfill 工作得非常好,而不依赖于重量级的第三方库。
    【解决方案2】:

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

    map - MDN

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

    【讨论】:

    • 我发现兼容性脚本也很有用。
    • 那么map() 有什么替代方案吗?我网站的大多数用户都使用 IE8 .. 而我在代码中使用了 map(),我现在该怎么办? (注:我用jquery)
    • @Shafizadeh - 如果您访问我发布的链接,您会看到 MDN 提供了一个 Polyfill,允许您在 IE8 中使用 map 方法。
    【解决方案3】:
    (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)})
    

    And?... "[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);
    

    还有测试:

    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);
    

    预期结果:

    [对象数组] [undefined, 1, undefined, 3, undefined, 5]

    [对象数组][undefined, 4, undefined, 16, undefined, 64]

    [对象数组][undefined, 1, undefined, 3, undefined, 5]

    【讨论】:

    • 爱它。更好的解决方案!
    • reduce 的 polyfill 是什么?
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      On MSDN it is said in Requirements for map: Not supported in the following document modes: Quirks, Internet Explorer 6 standards, Internet Explorer 7 standards, Internet Explorer 8 standards.

      Map 只是数组的“访问者”模式的实现。很容易替代它:

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

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

      【讨论】:

        猜你喜欢
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 2016-07-07
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 2011-12-09
        • 2013-09-01
        相关资源
        最近更新 更多