Question

I wish to run a function that exists on each of my array's elements.
I know it can be done with a for loop, an each, and map, but none of these pursue a pure functional approach. for example, with map it would look something like this:
var a = [1,2,3].map(function(item) { item.funcName(params); });

I do not care about the return values of these functions

example code I wish I had:
var a = [1,2,3].magicRun('funcName'[, paramsArray]);;

Is there such a thing in pure JS? It there such a thing in ExtJS? (which I have avail. loaded ver. 4.1)

Thanks!

Was it helpful?

Solution

There's nothing exactly like what you want in pure JS, and I don't think ExtJS has it either (but I haven't used ExtJS in anger since version 3.something, so there might be)

MooTools however adds this invoke method to Array:

invoke: function(methodName){
  var args = Array.slice(arguments, 1);
  return this.map(function(item){
    return item[methodName].apply(item, args);
  });
},

...which being released under the MIT license, you can lift without any bad karma

OTHER TIPS

In pure Js you can add the function "map" to Array object prototype

In this example I make the sqrt of every element of the array

if (!Array.prototype.map)
    Array.prototype.map = function(fun)
    {
        var len = this.length;
        if (typeof fun != "function")
            throw new TypeError();
        var res = new Array(len);
        for (var i = 0; i < len; ++i)
            res[i] = fun(this[i]);
        return res;
};


var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);

//could be an alert
console.log("roots is : " + roots );
if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
        fun.call(thisp, this[i], i, this);
    }
  };
}

exemple:

<html>
<head>
<title>JavaScript Array forEach Method</title>
</head>
<body>
<script type="text/javascript">
if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
        fun.call(thisp, this[i], i, this);
    }
  };
}

function printBr(element, index, array) {
  document.write("<br />[" + index + "] is " + element ); 
}

[12, 5, 8, 130, 44].forEach(printBr);

</script>
</body>
</html>

source: http://www.tutorialspoint.com/javascript/array_foreach.htm

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top