it-swarm.it

La funzione javascript .map () è supportata in IE8?

Quando si fa questo:

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

in IE8 ottengo:

"Object doesn't support this property or method"

Questo metodo non è supportato in IE8 o ho qualche altro problema? Ho avuto un Google, ma ho ricevuto molti problemi/domande su JavaScript di Google Maps ...

Modificare: OK, quindi IE8 e versioni precedenti NON supportano la funzione .map (). Copia-incolla il codice da MDN qui che aggiungerà la funzione .map () al prototipo di Array esattamente secondo le specifiche se non supportato nativamente (e sembra funzionare perfettamente).

35
Richard H

IE8 non supporta map(). In caso di dubbi, controlla MDN (Mozilla Developer Network):

mappa - MDN

Sembra che IE abbia aggiunto il supporto per map() nella versione 9.

40
Justin Niessner

La soluzione è jQuery.map

Invece di questo: a.map(function( ) { });

Devi fare

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

Metti da parte prima la prima chiamata .map o .filter. Problema risolto. Il metodo jQuery.map () non funziona come previsto.

AGGIORNAMENTO: L'ho appena testato su array sparsi: se l'argomento map o filter è una funzione che accetta e gestisce il valore undefined, funziona, ma i risultati non sono ovvi:

Definiamo array sparse test:

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

Vediamo cosa dice IE8 su t: "[indefinito, 1, non definito, 3, non definito, 5]"

Proviamo:

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

Che cos'è, IE8? È: "[1, 3]" . Nota: nessun valore indefinito. Lo aspetterei personalmente.

Ma prova QUESTO:

t.map(function(x){return 2<<x})

E ... "[2, 4, 2, 16, 2, 64]" . Quello è strano! :) Prova questo:

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

E? ... "[NaN, 2, NaN, 8, NaN, 32]" - Preferisco aspettare questo risultato per il test precedente. È almeno logico: Math.pow () dovrebbe restituire un tipo number, NaN, indipendentemente dal significato IS di un tipo number speciale riservato per operazioni non valide. Quindi il risultato è più o meno corretto. Sarebbe completamente corretto come map risultato se t è rimasto un array sparse.

Quindi, senza ulteriori ado - in definitiva la versione corretta dei metodi map e 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);

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

Risultati aspettati:

[oggetto Array] [indefinito, 1, indefinito, 3, non definito, 5]

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

[oggetto Array] [indefinito, 1, indefinito, 3, non definito, 5]

21
Harry

MDN dice che IE 9 lo supporta. Nessuna menzione di IE 8.

enter image description here

7
Vivin Paliath

In MSDN è indicato in Requisiti per la mappa: Non supportato nelle seguenti modalità documento: Quirk, standard di Internet Explorer 6, standard di Internet Explorer 7, standard di Internet Explorer 8.

Map è solo un'implementazione del pattern "Visitor" per array. Così facile sostituto potrebbe essere:

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

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

    return result;
}

La funzione accetta anche array e funzioni che invocano su ciascun elemento dell'array. Restituisce un nuovo array con il risultato della chiamata del visitatore per ogni elemento dell'array originale 

0
Alex Tsurika