(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()方法的效果不如预期。
更新:
我刚刚在稀疏数组上进行了测试:如果map或filter参数是一个接受和处理undefined值的函数-它可以工作,但结果并不明显:
让我们定义一个测试稀疏数组:
var t = []
t[1] = 1
让我们看看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
类型,用于无效操作。因此,结果或多或少是正确的。如果 t 仍然是一个稀疏数组,则 map
的结果将完全正确。
所以,不再做过多解释 - 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);
And the test:
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]