假设我有以下复选框:
<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]
最快的方式
而——在大多数浏览器上更快
直接设置变量比推设置快
功能:
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循环没有优化!
我的五分钱:
两个方向的整数数组函数。
当range(0,5)变为[0,1,2,3,4,5]时。
范围(5,0)变为[5,4,3,2,1,0]。
基于这个答案。
function range(start, end) {
const isReverse = (start > end);
const targetLength = isReverse ? (start - end) + 1 : (end - start ) + 1;
const arr = new Array(targetLength);
const b = Array.apply(null, arr);
const result = b.map((discard, n) => {
return (isReverse) ? n + end : n + start;
});
return (isReverse) ? result.reverse() : result;
}
附注:为了在现实生活中使用,你还应该检查isFinite()和isNaN()的参数。