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).
IE8 ne supporte pas map()
. En cas de doute, vérifiez MDN (Mozilla Developer Network):
On dirait que IE a ajouté le support de map()
dans la version 9.
La solution est jQuery.map
Au lieu de ceci: a.map(function( ) { });
Tu dois faire
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);
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]
MDN indique que IE 9 le prend en charge. Aucune mention de IE 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.