假设我有以下复选框:
<input type="checkbox" value="1-25" />
为了得到定义我正在寻找的范围边界的两个数字,我使用下面的jQuery:
var value = $(this).val();
var lowEnd = Number(value.split('-')[0]);
var highEnd = Number(value.split('-')[1]);
然后,我如何创建一个包含lowEnd和highEnd之间的所有整数的数组,包括lowEnd和highEnd本身?对于这个特定的例子,显然,结果数组将是:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
function range(j, k) {
return Array
.apply(null, Array((k - j) + 1))
.map(function(_, n){ return n + j; });
}
这大致相当于
function range(j, k) {
var targetLength = (k - j) + 1;
var a = Array(targetLength);
var b = Array.apply(null, a);
var c = b.map(function(_, n){ return n + j; });
return c;
}
分解一下:
var targetLength = (k - j) + 1;
var a = Array(targetLength);
这将创建一个具有正确标称长度的稀疏矩阵。现在,稀疏矩阵的问题是尽管它有正确的标称长度,但它没有实际的元素,所以,对于
j = 7, k = 13
console.log(a);
给了我们
Array [ <7 empty slots> ]
Then
var b = Array.apply(null, a);
将稀疏矩阵作为参数列表传递给Array构造函数,该构造函数生成一个(实际)长度为targetLength的密集矩阵,其中所有元素都具有未定义的值。第一个参数是数组构造函数执行上下文的“this”值,在这里没有作用,因此为null。
现在,
console.log(b);
收益率
Array [ undefined, undefined, undefined, undefined, undefined, undefined, undefined ]
最后
var c = b.map(function(_, n){ return n + j; });
利用了数组。映射函数通过:当前元素的值和2。当前元素的索引,映射委托/回调。第一个参数将被丢弃,而第二个参数在调整开始偏移量后可用于设置正确的序列值。
然后
console.log(c);
收益率
Array [ 7, 8, 9, 10, 11, 12, 13 ]
最快的方式
而——在大多数浏览器上更快
直接设置变量比推设置快
功能:
var x=function(a,b,c,d){d=[];c=b-a+1;while(c--){d[c]=b--}return d},
theArray=x(lowEnd,highEnd);
or
var arr=[],c=highEnd-lowEnd+1;
while(c--){arr[c]=highEnd--}
编辑
可读版本
var arr = [],
c = highEnd - lowEnd + 1;
while ( c-- ) {
arr[c] = highEnd--
}
Demo
http://jsfiddle.net/W3CUn/
对于持悲观态度的选民
性能
http://jsperf.com/for-push-while-set/2
ie更快,firefox快3倍
只有在aipad air上,for循环速度略快。
在win8, osx10.8, ubuntu14.04, ipad, ipad air, ipod上测试;
chrome,ff,即,safari,移动safari。
我希望看到旧ie浏览器的性能,其中for循环没有优化!
将http://minifiedjs.com/添加到答案列表中:)
Code类似于下划线和其他:
var l123 = _.range(1, 4); // same as _(1, 2, 3)
var l0123 = _.range(3); // same as _(0, 1, 2)
var neg123 = _.range(-3, 0); // same as _(-3, -2, -1)
var empty = _.range(2,1); // same as _()
文档:
http://minifiedjs.com/api/range.html
我使用minify .js,因为它解决了我所有的问题,占用空间小,语法容易理解。对我来说,它是一个框架中jQuery, MustacheJS和下划线/SugarJS的替代品。
当然,它不像下划线那样流行。这可能是一些人的担忧。
Minified是由Tim Jansen使用CC-0(公共域)许可证提供的。