web-dev-qa-db-ja.com

IE8ではjavascript .map()関数がサポートされていますか?

これを行うとき:

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

iE8で私は得る:

"Object doesn't support this property or method"

この方法はIE8でサポートされていませんか、それとも他の問題がありますか?私はグーグルを持っていましたが、多くのグーグルマップのjavascriptの問題/質問を受け取ります...

編集:OK。IE8以下では.map()関数をサポートしていません。 MDN here からコードをコピーアンドペーストします。ネイティブにサポートされていない場合は、仕様どおりに.map()関数をArrayプロトタイプに追加します(完全に機能するようです)。

35
Richard H

IE8はmap()をサポートしていません。疑わしい場合は、MDN(Mozilla Developer Network)を確認してください。

マップ-MDN

IEバージョン9でmap()のサポートが追加されました。

40
Justin Niessner

ソリューションはjQuery.mapです

これの代わりに:a.map(function( ) { });

あなたはしなければならない

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

43
(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()メソッドが期待どおりに機能しません。

PDATE:スパース配列でテストしました:マップまたはフィルター引数が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()は、意味に関係なくnumberNaNを返すことになっていますIS無効な操作のために予約されている特殊なnumber型。 tがスパース配列のままであれば、mapの結果として完全に正しいでしょう。

したがって、これ以上苦労することはありません-mapおよびfilterメソッドの最終的に正しいバージョン

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

推測される結果:

[オブジェクト配列] [未定義、1、未定義、3、未定義、5]

[オブジェクト配列] [未定義、4、未定義、16、未定義、64]

[オブジェクト配列] [未定義、1、未定義、3、未定義、5]

21
Harry

[〜#〜] mdn [〜#〜] は、IE 9がサポートしています。IE 8。

enter image description here

7
Vivin Paliath

MSDNでは、マップの要件に記載されています:次のドキュメントモードではサポートされていません:Quirks、Internet Explorer 6標準、Internet Explorer 7標準、Internet Explorer 8標準。

マップは、配列の「Visitor」パターンの単なる実装です。それの簡単な代替品は次のようになります:

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

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

    return result;
}

この関数は、各配列要素で呼び出す配列と関数も受け取ります。元の配列要素ごとにビジター呼び出しの結果を含む新しい配列を返します

0