これを行うとき:
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プロトタイプに追加します(完全に機能するようです)。
IE8はmap()
をサポートしていません。疑わしい場合は、MDN(Mozilla Developer Network)を確認してください。
IEバージョン9でmap()
のサポートが追加されました。
ソリューションはjQuery.mapです
これの代わりに:a.map(function( ) { });
あなたはしなければならない
jQuery.map(a, function( ) { //what ever you want todo .. }
(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()は、意味に関係なくnumber
型NaN
を返すことになっています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]
[〜#〜] mdn [〜#〜] は、IE 9がサポートしています。IE 8。
マップは、配列の「Visitor」パターンの単なる実装です。それの簡単な代替品は次のようになります:
function visitArray(arr, visitor) {
var result = [];
for (var i = 0; i < arr.length; i ++) {
result[i] = visitor(arr[i]);
}
return result;
}
この関数は、各配列要素で呼び出す配列と関数も受け取ります。元の配列要素ごとにビジター呼び出しの結果を含む新しい配列を返します