Jquery range utility for fast iteration ($ R equivalent prototype)
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
});
a source to share
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
a source to share