(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; 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)})
And?... "[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);
还有测试:
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);
预期结果:
[对象数组] [undefined, 1, undefined, 3, undefined, 5]
[对象数组][undefined, 4, undefined, 16, undefined, 64]
[对象数组][undefined, 1, undefined, 3, undefined, 5]