(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]