Поддерживается ли функция javascript .map () в IE8? - PullRequest
35 голосов
/ 08 сентября 2011

При этом:

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

в IE8 я получаю:

"Object doesn't support this property or method"

Этот метод не поддерживается в IE8, или у меня есть другие проблемы? У меня был Google, но я получаю много вопросов и вопросов по JavaScript на Google Картах ...

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

Ответы [ 5 ]

43 голосов
/ 22 января 2013

Решение - jQuery.map

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

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

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

40 голосов
/ 08 сентября 2011

IE8 не поддерживает map(). В случае сомнений проверьте MDN (Сеть разработчиков Mozilla):

карта - MDN

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

21 голосов
/ 22 мая 2013
(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]" . Примечание - нет неопределенных значений. Я лично ожидал бы этого.

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

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 оставался разреженным массивом.

Так что без лишних слов - окончательно правильная версия 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);

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

[массив объектов] [не определено, 1, не определено, 3, не определено, 5]

[массив объектов] [не определено, 4, не определено, 16, не определено, 64]

[массив объектов] [не определено, 1, не определено, 3, не определено, 5]

7 голосов
/ 08 сентября 2011

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

enter image description here

0 голосов
/ 11 июня 2015

В MSDN сказано в Требованиях к карте: Не поддерживается в следующих режимах документа: Причуды, стандарты Internet Explorer 6, стандарты Internet Explorer 7, стандарты Internet Explorer 8.Карта - это просто реализация шаблона "Visitor" для массива.Его можно легко заменить:

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

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

    return result;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...