JavaScript扩展Array以实现map2

时间:2015-01-18 07:51:01

标签: javascript

我想扩展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)
      } 
   }

请让我知道,我可以采取什么方法来做到这一点

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;
});

Example

关于您的错误,请不要将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