Wenn Sie dies tun:
var a = new Array("a", "b");
a.map(function() { });
in IE8 bekomme ich:
"Object doesn't support this property or method"
Wird diese Methode in IE8 nicht unterstützt oder habe ich ein anderes Problem? Ich hatte ein Google-Konto, aber viele JavaScript-Probleme/Fragen zu Google Maps ...
Bearbeiten: OK, also unterstützen IE8 und darunter NICHT die .map () - Funktion. Kopieren Sie den Code aus MDN hier , wodurch die .map () - Funktion genau nach den Spezifikationen zum Array-Prototyp hinzugefügt wird, sofern er nicht nativ unterstützt wird (und er scheint perfekt zu funktionieren).
IE8 unterstützt map()
nicht. Überprüfen Sie im Zweifelsfall MDN (Mozilla Developer Network):
Es sieht so aus, als ob IE Unterstützung für map()
in Version 9 hinzugefügt hat.
Die Lösung ist jQuery.map
Stattdessen: a.map(function( ) { });
Du musst
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);
Platzieren Sie vor dem ersten Aufruf von .map oder .filter. Problem gelöst. Die jQuery.map () -Methode funktioniert nicht wie erwartet.
UPDATE: Ich habe es gerade mit spärlichen Arrays getestet: Wenn Map- oder Filterargument eine Funktion ist, die undefined
-Wert akzeptiert und verarbeitet, funktioniert es, aber die Ergebnisse sind nicht offensichtlich:
Definieren wir ein Test-Sparse-Array:
var t = []
t[1] = 1; t[3] = 3; t[5] = 5;
Mal sehen, was IE8 über t sagt: "[undefined, 1, undefined, 3, undefined, 5]"
Lass es uns versuchen:
t.filter(function(x){return x<4})
Was ist das, IE8? Es ist: "[1, 3]" . Hinweis - keine undefinierten Werte. Das würde ich persönlich erwarten.
Aber versuche DIESES:
t.map(function(x){return 2<<x})
Und ... "[2, 4, 2, 16, 2, 64]" . Das ist komisch! :) Versuche dies:
t.map(function(x){return Math.pow(2,x)})
Und? ... "[NaN, 2, NaN, 8, NaN, 32]" - Ich würde dieses Ergebnis eher für den vorherigen Test erwarten. Es ist zumindest logisch - Math.pow () soll einen number
-Typ NaN
zurückgeben, unabhängig von seiner Bedeutung IS ein spezieller number
-Typ, der für ungültige Operationen reserviert ist. Das Ergebnis ist also mehr oder weniger korrekt. Es wäre völlig korrekt als map
Ergebnis, wenn t ein spärliches Array bleibt.
Also ohne weiteres - letztendlich korrekte Version der map
- und filter
-Methoden :
(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);
Und der 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);
Erwartete Ergebnisse:
[object Array] [undefined, 1, undefined, 3, undefined, 5]
[object Array] [undefined, 4, undefined, 16, undefined, 64]
[object Array] [undefined, 1, undefined, 3, undefined, 5]
MDN sagt, dass IE 9 dies unterstützt. Keine Erwähnung von IE 8.
Map ist nur eine Implementierung des "Visitor" -Musters für ein Array. Ein einfacher Ersatz dafür könnte sein:
function visitArray(arr, visitor) {
var result = [];
for (var i = 0; i < arr.length; i ++) {
result[i] = visitor(arr[i]);
}
return result;
}
Die Funktion benötigt auch array und function, die auf jedem Array-Element aufgerufen werden. Es gibt ein neues Array mit dem Ergebnis der Besucheraufforderung für jedes ursprüngliche Arrayelement zurück