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と同じに設定すると元の配列に再度インデックスを付けます。これは非効率的すぎるようです。これに対するより確立されたアプローチはありますか?

4

2 に答える 2

7

slice()する必要はありません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 に答える