Ответ 1
IE8 не поддерживает map()
. Если у вас есть сомнения, проверьте MDN (Mozilla Developer Network):
Похоже, IE добавила поддержку map()
в версии 9.
При этом:
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 точно по спецификациям, если не поддерживается на основе он работает отлично).
IE8 не поддерживает map()
. Если у вас есть сомнения, проверьте MDN (Mozilla Developer Network):
Похоже, IE добавила поддержку map()
в версии 9.
Решение: jQuery.map
Вместо этого:
a.map(function( ) { });
Вы должны сделать
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);
Поместите где-нибудь перед первым вызовом .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]
MDN говорит, что IE 9 поддерживает его. Не упоминается IE 8.
Карта - это всего лишь реализация шаблона "Посетитель" для массива. Так легко заменить его:
function visitArray(arr, visitor) {
var result = [];
for (var i = 0; i < arr.length; i ++) {
result[i] = visitor(arr[i]);
}
return result;
}
Функция также принимает массив и функцию, которые необходимо вызвать для каждого элемента массива. Он возвращает новый массив с результатом обращения посетителя для каждого исходного элемента массива