2011-09-08 15 views
34

Nel fare questo:La funzione javascript .map() è supportata in IE8?

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

in IE8 ottengo:

"Object doesn't support this property or method" 

È questo il metodo non supportato in IE8, o devo qualche altro problema? Ho avuto un Google, ma ho un sacco di problemi/domande su JavaScript di Google Maps ...

Modifica: OK, così IE8 e seguenti NON supportano la funzione .map(). Copia-incolla il codice da MDN here che aggiungerà la funzione .map() al prototipo di Array esattamente secondo le specifiche se non supportato nativamente (e sembra funzionare perfettamente).

+0

sì ... non supportato .. –

risposta

40

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

map - MDN

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

+0

Ok, grazie. Non ho capito che MDC ha dati di supporto. –

+0

Ho trovato utile anche lo script di compatibilità. –

+0

Bene c'è qualche alternativa per 'map()'? La maggior parte degli utenti del mio sito Web utilizza IE8. E ho usato 'map()' nel mio codice, cosa dovrei fare ora? * (Nota: utilizzo jquery) * – Shafizadeh

7

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

enter image description here

43

La soluzione è jQuery.map

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

Devi fare

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

+2

grazie! questo dovrebbe essere incluso nella risposta esclusa. – ProblemsOfSumit

+0

Perfetto, non posso credere di essermi perso questo. Sei l'uomo, grazie! Anche questa dovrebbe essere la * risposta accettata *. Quello sopra è inutile. –

+5

È utile ma non dovrebbe essere la risposta accettata come altri stanno dicendo. Nessuno ha detto che l'OP stava usando jQuery e jQuery non è la risposta a tutto. –

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

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

UPDATE: ho appena testato su array sparsi: se la mappa o argomento di filtro è una funzione che accetta e gestisce undefined valore - funziona, ma i risultati non sono evidenti:

Definiamo Test matrice sparsa:

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

Vediamo che cosa dicono di IE8 t: "[indefinito, 1, non definito, 3, indefinita, 5]"

Proviamo:

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

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

Ma provate 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]" - Preferirei aspettare questo risultato del test precedente. È almeno logico: Math.pow() dovrebbe restituire un tipo number, NaN, indipendentemente dal significato È un tipo speciale number riservato per operazioni non valide. Quindi il risultato è più o meno corretto. Sarebbe completamente corretto come risultato map se t rimanesse un array sparse.

Quindi, senza ulteriori indugi - ultima analisi corretta versione di map e filter metodi:

(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 attesi:

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

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

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

+0

Love it. Ancora migliore soluzione! –

+1

Questo non funziona in IE8 – acconrad

+0

Quale sarebbe il polyfill da ridurre? –

0

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.

La mappa è 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 prende anche array e funzione che richiamare su ogni elemento dell'array. Restituisce un nuovo array con il risultato della chiamata del visitatore per ogni elemento dell'array originale

Problemi correlati