我想扩展javascript数组来实现map2功能而不使用内置的map功能。其中map2功能将数组传递的值加倍。
例如:
var m = [1,2,3,4,5]
var double = [1,2,3,4,5].map2(doubleFn)
console.log(double) should output 2,4,6,8,10
以上功能需要由开发而不是使用任何内置的JS数组方法
代码段
Array.prototype.map2= function(callback, thisArg){
var len=this.length
for(var i in this){
callback.call(this,this[i]*2)
}
}
请让我知道,我可以采取什么方法来做到这一点
答案 0 :(得分:2)
Array.prototype.map2 = function (callback, thisArg){
var i, el,
len = this.length,
res = [],
_this = thisArg ? thisArg : this;
for (i = 0; i < len; i++) {
el = this[i]; // also you can use this[i] * 2 - it depend what do want;
res[i] = callback.call(_this, el);
}
return res;
};
var double = [1,2,3,4,5].map2(function (el) {
return el * 2;
});
关于您的错误,请不要将for..in
用于数组。在map
中,您需要创建新数组并将其返回...
答案 1 :(得分:1)
我猜你想重新实现内置的Array.prototype.map
。
以下是其中一种方法:
Array.prototype.map2 = function(f1){
var a = [];
this.forEach(function(element){
a.push(f1(element));
})
return a;
}
a = [1,2,3,4,5]
console.log(a.map2(function(a){return a<<1;});
//output: [ 2, 4, 6, 8, 10 ]
修改:不使用内置函数:
Array.prototype.map2 = function(f1){
var a = [];
var that = this;
return (function recArray(index, target){
if(typeof(that[index]) !== 'undefined') {
target[index] = f1(that[index]);
return recArray(index + 1, target);
}
return target;
})(0, a);
}
但此解决方案存在问题:
如果输入数组有漏洞怎么办:
a = [1,2,3,4,5]
a[12] = 11
//now a is: [ 1, 2, 3, 4, 5, , , , , , , , 11 ]
JavaScript数组可能有漏洞,如果中间有undefined
个值,则上述方法将失败。在不知道数组长度的情况下,如果它包含“空洞”,则无法遍历它。
显式存储长度没有意义,因为它存储在Array.prototype.length
中。
因此,如果数组不连续,那么不使用长度就不可能实现map
。