在原型的繁锁:jQuery的范围实用
for (i=0; i<10; i++) { ... }
可以写成
$R(0, 10).each(function(i){ ... });
有范围在JQuery中的相同呢?
在原型的繁锁:jQuery的范围实用
for (i=0; i<10; i++) { ... }
可以写成
$R(0, 10).each(function(i){ ... });
有范围在JQuery中的相同呢?
见http://code.google.com/p/jquery-utils/source/browse/trunk/src/jquery.arrayUtils.js?r=452
jQuery的不提供范围扩大本身,但它是一个简单的加法。它只有两个部分。首先,范围函数应该返回一个数组,范围中的每个项目都扩展为一个数组值。接下来,将方法添加到Array
以迭代处理函数中传递的每个对象。
这里我们定义了forEach
,它是用于遍历数组的ECMA-262标准的一部分。有关更多详细信息,请参见MDC。
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);
}
};
}
接下来,我们需要一个函数将范围扩展到jQuery名称空间内的数组。从上面的网址采取的措施(原始来源 - 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's 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;
}
});
Alrighty,现在我们可以这样做:
$.range(2, 10).forEach(function(v) {
console.log(v); // 2, 3, 4, .., 9
});
或者用自定义步长值,而不是1
$.range(2, 20, 4).forEach(function(v) {
console.log(v); // 2, 6, 10, 14, 18
});
使用
我更喜欢一个数组的生成器 - 更优雅(imho)和更高的内存效率。
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;
};
那么你可以简单
var range = new Range(3, 5);
for (var i in range)
print(i); // prints 3, then 4, then 5 in sequence
来源:https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Iterators_and_Generators
有趣的 “累赘” 第一个例子是如何比第二个例子个字符。它也会跑得更快。 – 2010-05-18 10:15:28
不可否认,第一个例子确实存在将循环变量'i'放入当前范围(或者全局范围,如果在此范围的其他地方没有'var i')的缺点。 – 2010-05-18 15:57:16
也许不是在上面的例子中,因为它处理的数字不是索引,但是当迭代集合时,所有那些我在'var i = 0;我
Anurag
2010-05-19 02:24:25