3

我有一个包含变量和函数的数组。该数组有 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 时再次重新索引原始数组。这似乎效率太低了。有没有更成熟的方法来解决这个问题?

4

2 回答 2

7

你不需要slice()then splice()Splice() 返回删除的元素,所以你只需要这样做:

var n = array.splice(0, 20);
a2 = array.concat(n);

完全清楚的是,JavaScript 的splice()方法返回已移除的元素,而不是剩余的元素。

此外,使用全局变量通常不是一个好主意,但你也有点以一种奇怪的方式混合它们。如果您要保持变量全局,我会将原始变量作为参数传递并从函数返回结果:

var a2=[the array with 80 elements];
a2 = run(a2);

function run(array){
    var n = array.splice(0, 20);
    return array.concat(n);
}

或者

根本不要传递它,只需从一开始就引用全局:

var a2=[the array with 80 elements];
run();

function run(){
    var n = a2.splice(0, 20);
    a2 = a2.concat(n);
}
于 2012-12-31T20:11:28.777 回答
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

于 2012-12-31T20:37:18.417 回答