Подтвердить что ты не робот

Поддерживается ли функция javascript.map() в IE8?

При этом:

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

в IE8 я получаю:

"Object doesn't support this property or method"

Этот метод не поддерживается в IE8 или у меня есть другая проблема? У меня был Google, но у меня много проблем и вопросов javascript Google Maps...

Изменить: ОК, поэтому IE8 и ниже НЕ поддерживают функцию .map(). Скопируйте-вставьте код из MDN здесь, который добавит функцию .map() в прототип Array точно по спецификациям, если не поддерживается на основе он работает отлично).

4b9b3361

Ответ 1

IE8 не поддерживает map(). Если у вас есть сомнения, проверьте MDN (Mozilla Developer Network):

map - MDN

Похоже, IE добавила поддержку map() в версии 9.

Ответ 2

Решение: jQuery.map

Вместо этого: a.map(function( ) { });

Вы должны сделать

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

Ответ 3

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

Поместите где-нибудь перед первым вызовом .map или .filter. Задача решена. jQuery.map() не работает должным образом.

UPDATE: Я только что проверил его на разреженных массивах: если аргумент map или filter - это функция, которая принимает и обрабатывает значение undefined - она ​​работает, но результаты не очевидны:

Позвольте определить тестовый разреженный массив:

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

Посмотрим, что говорит IE8 о t: "[undefined, 1, undefined, 3, undefined, 5]"

Попробуйте:

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

Что это, IE8? Это: "[1, 3]" . Примечание - нет значений undefined. Я лично ожидал бы этого.

Но попробуйте ЭТО:

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

И... "[2, 4, 2, 16, 2, 64]" . Тот странный!:) Попробуйте следующее:

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

И?... "[NaN, 2, NaN, 8, NaN, 32]" . Я предпочел бы ожидать этого результата для предыдущего теста. Он по крайней мере логичен - Math.pow() должен возвращать тип number, NaN, независимо от того, что это означает специальный тип number, зарезервированный для недействительных операций. Таким образом, результат более или менее правильный. Это было бы полностью корректно как результат map, если t остался разреженным массивом.

Итак, без дальнейшего ado - в конечном итоге исправить версию методов map и 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);

И тест:

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

Ожидаемые результаты:

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

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

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

Ответ 4

MDN говорит, что IE 9 поддерживает его. Не упоминается IE 8.

enter image description here

Ответ 5

В MSDN сказано в Требованиях к карте: Не поддерживается в следующих режимах документа: Quirks, стандарты Internet Explorer 6, стандарты Internet Explorer 7, стандарты Internet Explorer 8.

Карта - это всего лишь реализация шаблона "Посетитель" для массива. Так легко заменить его:

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

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

    return result;
}

Функция также принимает массив и функцию, которые необходимо вызвать для каждого элемента массива. Он возвращает новый массив с результатом обращения посетителя для каждого исходного элемента массива