objects example array javascript internet-explorer-8 map

array - map javascript example



¿La función javascript.map() es compatible con IE8? (5)

Al hacer esto:

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

en IE8 obtengo:

"Object doesn''t support this property or method"

¿Este método no es compatible con IE8, o tengo algún otro problema? He tenido un Google, pero tengo muchos problemas / preguntas de JavaScript de Google Maps ...

Editar : OK, IE8 y abajo NO son compatibles con la función .map (). Copie y pegue el código de MDN here que agregará la función .map () al prototipo de matriz exactamente según las especificaciones si no es compatible de forma nativa (y parece funcionar perfectamente).


IE8 no es compatible con map() . En caso de duda, verifique MDN (Mozilla Developer Network):

mapa - MDN

Parece que IE agregó soporte para map() en la versión 9.


La solución es jQuery.map

En lugar de esto: a.map(function( ) { });

Tu tienes que hacer

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


MDN dice que IE 9 lo admite. Sin mención de IE 8.


En MSDN, se dice en Requisitos para el mapa: no se admite en los siguientes modos del documento: inconvenientes, estándares de Internet Explorer 6, estándares de Internet Explorer 7, estándares de Internet Explorer 8.

El mapa es solo una implementación del patrón "Visitante" para la matriz. Tan fácil sustituto podría ser:

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

La función también toma la matriz y la función que invocar en cada elemento de la matriz. Devuelve una nueva matriz con el resultado de la invocación de visitante para cada elemento de matriz original


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

Poner en cualquier lugar antes de la primera llamada .map o .filter. Problema resuelto. El método jQuery.map () no funciona como se esperaba.

ACTUALIZACIÓN: Acabo de probarlo en matrices dispersas: si el argumento de mapa o filtro es una función que acepta y maneja undefined valor undefined , funciona, pero los resultados no son obvios:

Vamos a definir la matriz dispersa de prueba:

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

Veamos qué dice IE8 sobre t: "[indefinido, 1, indefinido, 3, indefinido, 5]"

Intentemos:

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

¿Qué es, IE8? Es: "[1, 3]" . Nota: no hay valores indefinidos. Yo personalmente esperaría eso.

Pero prueba ESTO:

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

Y ... "[2, 4, 2, 16, 2, 64]" . ¡Eso es raro! :) Prueba esto:

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

Y? ... "[NaN, 2, NaN, 8, NaN, 32]" - Prefiero esperar este resultado para la prueba anterior. Es al menos lógico: se supone que Math.pow () devuelve un tipo de number , NaN , independientemente de su significado ES un tipo de number especial reservado para operaciones no válidas. Entonces el resultado es más o menos correcto. Sería totalmente correcto como resultado del map si t sigue siendo una matriz dispersa.

Así que sin más preámbulos, en última instancia, la versión correcta de map métodos de map y 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);

Y la prueba:

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

Resultados previstos:

[objeto Matriz] [indefinido, 1, indefinido, 3, indefinido, 5]

[objeto Matriz] [indefinido, 4, indefinido, 16, indefinido, 64]

[objeto Matriz] [indefinido, 1, indefinido, 3, indefinido, 5]