Jquery range utility for fast iteration ($ R equivalent prototype)

In a prototype, cumbersome for:

for (i=0; i<10; i++) { ... }

      

can be written as

$R(0, 10).each(function(i){ ... });

      

Is there an equivalent to range in JQuery?

+2


a source to share


2 answers


See http://code.google.com/p/jquery-utils/source/browse/trunk/src/jquery.arrayUtils.js?r=452

jQuery doesn't provide range expansion natively, but it's a simple addition. There are only two parts. The range function must first return an array with each element in the range extended to the value of the array. Then add a method Array

to iterate over each object passing through the handler function.

Here we define forEach

this part of the ECMA-262 standard for iterating over arrays. See MDC for details .

if (!Array.prototype.forEach) {
  Array.prototype.forEach = function(fun /*, thisp*/) {
    var len = this.length >>> 0;
    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);
    }
  };
}

      

Next, we need a function to expand the ranges into an array in the jQuery namespace. Taken from the above url (original source - http://blog.outofhanwell.com/2006/03/29/javascript-range-function/ )



$.extend({
    // Returns a range object
    // Author: Matthias Miller
    // Site:   http://blog.outofhanwell.com/2006/03/29/javascript-range-function/
    range:  function() {
        if (!arguments.length) { return []; }
        var min, max, step;
        if (arguments.length == 1) {
            min  = 0;
            max  = arguments[0]-1;
            step = 1;
        }
        else {
            // default step to 1 if it zero or undefined
            min  = arguments[0];
            max  = arguments[1]-1;
            step = arguments[2] || 1;
        }
        // convert negative steps to positive and reverse min/max
        if (step < 0 && min >= max) {
            step *= -1;
            var tmp = min;
            min = max;
            max = tmp;
            min += ((max-min) % step);
        }
        var a = [];
        for (var i = min; i <= max; i += step) { a.push(i); }
        return a;
    }
});

      

Ok, now we can do:

$.range(2, 10).forEach(function(v) {
    console.log(v); // 2, 3, 4, .., 9
});

      

Or use it with a custom step value instead of 1

$.range(2, 20, 4).forEach(function(v) {
    console.log(v); // 2, 6, 10, 14, 18
});

      

+4


a source


I would prefer a generator for an array - more elegant (imho) and more memory efficient.

function Range(low, high){
  this.low = low;
  this.high = high;
}
Range.prototype.__iterator__ = function(){
  for (var i = this.low; i <= this.high; i++)
    yield i;
};

      

Then you can simply



var range = new Range(3, 5);
for (var i in range)
  print(i); // prints 3, then 4, then 5 in sequence

      

From: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Iterators_and_Generators

+1


a source







All Articles