web-dev-qa-db-fra.com

La fonction javascript .map () est-elle prise en charge dans IE8?

En faisant ceci:

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

dans IE8 je reçois:

"Object doesn't support this property or method"

Cette méthode n'est-elle pas prise en charge dans IE8 ou ai-je un autre problème? J'ai un Google, mais j'ai beaucoup de problèmes/questions javascript sur Google Maps ...

Modifier: OK, donc IE8 et les versions antérieures NE prennent PAS en charge la fonction .map (). Copiez-collez le code à partir de MDN ici qui ajoutera la fonction .map () au prototype Array exactement selon les spécifications si elle n’est pas supportée de manière native (et cela semble fonctionner parfaitement).

35
Richard H

IE8 ne supporte pas map(). En cas de doute, vérifiez MDN (Mozilla Developer Network):

carte - MDN

On dirait que IE a ajouté le support de map() dans la version 9.

40
Justin Niessner

La solution est jQuery.map

Au lieu de ceci: a.map(function( ) { });

Tu dois faire

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

43
Interactive Tribe
(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);

Mettez n'importe où avant le premier appel .map ou .filter. Problème résolu. La méthode jQuery.map () ne fonctionne pas comme prévu.

UPDATE: Je viens de le tester sur des tableaux épars: si map ou filter est une fonction qui accepte et gère la valeur undefined - cela fonctionne, mais les résultats ne sont pas évidents:

Définissons le tableau fragmenté de test:

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

Voyons ce que dit IE8 à propos de t: "[indéfini, 1, indéfini, 3, indéfini, 5]"

Essayons:

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

Qu'est-ce que c'est, IE8? C'est: "[1, 3]" . Remarque - pas de valeurs indéfinies. Je m'attendrais personnellement à cela.

Mais essayez ceci:

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

Et ... "[2, 4, 2, 16, 2, 64]" . C'est bizarre! :) Essaye ça:

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

Et? ... "[NaN, 2, NaN, 8, NaN, 32]" - Je m'attendrais plutôt à ce résultat pour le test précédent. C'est au moins logique - Math.pow () est censé renvoyer un type number, NaN, quelle que soit sa signification IS, un type spécial number réservé aux opérations non valides. Donc, le résultat est plus ou moins correct. Il serait tout à fait correct que map résultat si t reste un tableau fragmenté.

Donc, sans plus tarder - finalement la version correcte des méthodes map et 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);

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

Résultats attendus:

[objet Array] [undefined, 1, undefined, 3, undefined, 5]

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

[objet Array] [undefined, 1, undefined, 3, undefined, 5]

21
Harry

MDN indique que IE 9 le prend en charge. Aucune mention de IE 8.

enter image description here

7
Vivin Paliath

Sur MSDN, cela est indiqué dans Configuration requise pour la carte: Non pris en charge dans les modes de document suivants: Quirks, normes Internet Explorer 6, normes Internet Explorer 7, normes Internet Explorer 8.

La carte est juste une implémentation du motif "Visiteur" pour le tableau. Un substitut si facile à cela pourrait être:

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

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

    return result;
}

La fonction prend également tableau et fonction à invoquer sur chaque élément du tableau. Il retourne un nouveau tableau avec le résultat de l'invocation de visiteur pour chaque élément de tableau d'origine. 

0
Alex Tsurika