我有一个包含变量和函数的数组。该数组长80个元素。前20个元素在for循环中一起使用。循环完成后,前20个元素移动到数组的后面,for循环再次开始。
我正在以这种方式重建数组:
var a2=[the array with 80 elements];
run(a2);
function run(array){
var n=array.slice(0,20); array.splice(0,20);
var con=array.concat(n); a2=con;
}
所以我基本上索引(新)切片数组,在拼接后重新索引(原始)数组,在concat之后索引(新)数组,并在我将其设置为等于时重新索引原始数组concat。这看起来效率太低了。有没有更成熟的方法呢?
答案 0 :(得分:6)
您不需要slice()
然后splice()
。 Splice()
返回已删除的元素,因此您只需执行此操作:
var n = array.splice(0, 20);
a2 = array.concat(n);
要完全清楚,JavaScript的splice()
方法会返回已删除的元素,而不是剩余的元素。
另外,使用全局变量通常是一个坏主意,但你也有点混淆它们。如果你要保持变量全局,我会将原始的in作为参数传递并返回函数的结果:
var a2=[the array with 80 elements];
a2 = run(a2);
function run(array){
var n = array.splice(0, 20);
return array.concat(n);
}
OR
根本不传递它,只是从get-go引用全局:
var a2=[the array with 80 elements];
run();
function run(){
var n = a2.splice(0, 20);
a2 = a2.concat(n);
}
答案 1 :(得分:1)
你想要效率,所以这里是:http://jsfiddle.net/Hvcbj/
//This is tightly coupled to work for the first 20 of an 80 length array
function swapTwenty( array )
{
for( var i = 0, max = 20; i < max; i++ )
{
var temp = array[i];
for( var n = 1, len = 4; n < len; n++)
{
var base = (i + 20 * (n - 1)) % 80;
var tar = (i + 20 * n) % 80;
array[base] = array[tar];
array[tar] = temp;
}
}
}
修改强>
我曾假设通过交换而不是创建更多数组时间会被保存,但事实上我并不认为它是。虽然这可能在内存上占用的空间较小,但它的运行速度并不比接受的答案快。这是一个显示差异的jsperf:http://jsperf.com/array-modifications