Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Three map implementations in javascript. Which one is better?

Tags:

javascript

map

I wrote a simple map implementation for some task. Then, out of curiosity, I wrote two more. I like map1 but the code is kinda hard to read. If somebody is interested, I'd appreciate a simple code review.

Which one is better? Do you know some other way to implement this in javascript?

var map = function(arr, func) {
  var newarr = [];
  for (var i = 0; i < arr.length; i++) {
    newarr[i] = func(arr[i]);
  }
  return newarr;
};

var map1 = function(arr, func) {
  if (arr.length === 0) return [];
  return [func(arr[0])].concat(funcmap(arr.slice(1), func));
};

var map2 = function(arr, func) {
  var iter = function(result, i) {
    if (i === arr.length) return result;
    result.push(func(arr[i]));
    return iter(result, i+1);
  };
  return iter([], 0);
};

Thanks!

EDIT

I am thinking about such function in general.

For example, right now I am going to use it to iterate like this:

map(['class1', 'class2', 'class3'], function(cls) { 
    el.removeClass(cls);
});

or

ids = map(elements, extract_id); 
/* elements is a collection of html elements, 
   extract_id is a func that extracts id from innerHTML */
like image 499
Anton Kovalyov Avatar asked Dec 13 '22 02:12

Anton Kovalyov


1 Answers

What about the map implementation used natively on Firefox and SpiderMonkey, I think it's very straight forward:

if (!Array.prototype.map) {
  Array.prototype.map = function(fun /*, thisp*/)   {
    var len = this.length >>> 0;  // make sure length is a positive number
    if (typeof fun != "function") // make sure the first argument is a function
      throw new TypeError();

    var res = new Array(len);  // initialize the resulting array
    var thisp = arguments[1];  // an optional 'context' argument
    for (var i = 0; i < len; i++) {
      if (i in this)
        res[i] = fun.call(thisp, this[i], i, this);  // fill the resulting array
    }

    return res;
  };
}

If you don't want to extend the Array.prototype, declare it as a normal function expression.

like image 72
Christian C. Salvadó Avatar answered Mar 06 '23 16:03

Christian C. Salvadó