5

JavaScriptでは、次のような従来の方法で配列要素を埋めています。

myArray[12] = 123;
myArray[13] = 432;
myArray[14] = 233;
myArray[15] = 98;

1つのコマンドでこれをより速く行うことは可能ですか?

たとえば、数字[123, 432, 233, 98]myArray[12-15]...に入れるにはどうすればいいですか?1つずつではありません。


そして、この種のシナリオをどのように最適化できますか:

newArray[12] = oldArray[30];
newArray[13] = oldArray[31];
newArray[14] = oldArray[32];
newArray[15] = oldArray[33];

n 個の要素 (上記の例では 4 個) が、ある配列から互いに隣り合っている場合、別の配列に移動する必要がありますか?

ご意見をお聞かせください。

4

6 に答える 6

9
var myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
               12, 13, 14, 15, 16, 17, 18, 19, 20];
myArray.splice(12, 4, 123, 432, 233, 98);

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
//  123, 432, 233, 98, 16, 17, 18, 19, 20]

の最初のパラメーターspliceは開始するインデックス、2番目のパラメーターは削除する要素の数、残りは挿入する要素です。したがって、削除されたものと同じ番号を挿入すると、それらを置き換えることになります。

これを別のアレイから取得したい場合は、これを試すことができますが、それほどクリーンではありません。

var oldArray = [0, 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, 26, 27, 28, 29, 123, 
               432, 233, 98, 34, 35]
var newArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
               12, 13, 14, 15, 16, 17, 18, 19, 20];

[].splice.apply(newArray, [12, 4].concat(oldArray.slice(30, 30 + 4)));

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
// 123, 432, 233, 98, 16, 17, 18, 19, 20]

これはおそらくPointedEarsの提案よりも効率的ではありませんが、非常に単純であり、おそらく多くのユースケースに役立ちます。

于 2012-07-06T19:53:33.620 に答える
4

最も近いのは、 を使用spliceして入力位置を設定することです。

最初の引数は開始するインデックス、2 番目の引数は削除する項目の数、次の引数は値です....

これは、コンソールでいじる出力の一部です。

myArray = new Array(15)
myArray.splice(12, 4, 123, 432, 223, 98)
myArray.forEach(function(v, i){console.log(v, i)})
123 12
432 13
223 14
98 15
undefined
myArray[12]
123
myArray[13]
432
myArray[14]
223
myArray[15]
98

もちろん、これにはいくつかの欠点があります: 挿入したい値の配列を渡すことができず、配列が十分に大きくなければなりません (つまり、配列が少なくとも 12 の長さでない限り、インデックス 12 に挿入することはできません)。

ある配列のインデックスのセットの値を別の配列の別のインデックスのセットに転送するには、ループする必要があると思います。 splice配列としてではなく、個別に追加する値を取ります。もちろん、ループを使用して単一のメソッドを作成し、それを再利用することもできます。

于 2012-07-06T19:43:06.967 に答える
2

Array.prototype.push()Array.prototype.splice()は良いアイデアですが、push()常に配列の最後に追加され (つまり、lengthプロパティで指定されたインデックスから開始)、splice()挿入する前に挿入する要素と同じ数の要素を削除する必要があります ( 2 倍のコストがかかります)。必要に応じて)。

したがって、ループを使用する必要があります。

 for (var i = 12; i < 16; ++i)
 {
   _new[i] = old[i + 18];
 }

(newはキーワードであるため、予約済みです。サンプル コードは実行できません。_newここでは、それを回避するために使用しました。)

これは一般化できます。

function putValues(array1, array2, start1, start2, num)
{
  if (typeof start1 == "undefined") start1 = 0;
  if (typeof start2 == "undefined") start2 = 0;
  var max = (typeof num == "undefined") ? array2.length : start2 + num;

  for (var i = start1, j = start2; j < max; ++i, ++j)
  {
    array1[i] = array2[j];
  }
}

putValues(newArray, oldArray, 12, 30, 4);

インデックスが連続している必要がないように、1 つまたは 2 つのインデックスの配列を渡すなど、より洗練された一般化が考えられます。

(これを のメソッドにする誘惑に抵抗してください。ただし、まばらな配列に対して順序付けされていない方法で-を効率的に反復するときArray.prototypeに使用する必要がある場合を除きます。)Object.prototype.hasOwnProperty()forin

次回は、まず何かを試してみてください。

于 2012-07-06T19:58:17.297 に答える
1

関数を使用できpushます:

myarray.push([123, 432, 233, 98]);

配列全体を配列に追加するか、個々の項目を追加するには:

myarray.push(123, 432, 233, 98);

特定の場所に追加するには、関数を使用する必要がありsplice()ます。

ドキュメント:

于 2012-07-06T19:42:09.353 に答える
0

次のように、.concat() を使用する必要があります。

myArray = myArray.concat([123, 432, 233, 98])

または、次のように .push() を使用します。

myArray.push(123,432,233,98)
于 2012-07-06T19:43:22.553 に答える