Javascript,从前到后移动数组中的元素

时间:2012-12-31 20:05:52

标签: javascript

我有一个包含变量和函数的数组。该数组长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。这看起来效率太低了。有没有更成熟的方法呢?

2 个答案:

答案 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