JavaScriptで配列の先頭に新しい配列要素を追加するにはどうすればよいですか?


1585

配列の先頭に要素を追加または追加する必要があります。

たとえば、私の配列が次のようになっている場合:

[23, 45, 12, 67]

そして、私のAJAX呼び出しからの応答は34です。更新された配列を次のようにしたいと思います。

[34, 23, 45, 12, 67]

現在、私はこのようにすることを計画しています:

var newArray = [];
newArray.push(response);

for (var i = 0; i < theArray.length; i++) {
    newArray.push(theArray[i]);
}

theArray = newArray;
delete newArray;

これを行うより良い方法はありますか?JavaScriptには、これを行う組み込みの機能がありますか?

私の方法は複雑であり、O(n)より良い実装を見るのは本当に興味深いでしょう。


9
FYI:あなたが継続的に配列の先頭に要素を挿入する必要がある場合、それはより速く使用することですpushへの呼び出しに続くステートメントreverseの代わりに呼び出すのでは、unshiftすべての時間を。
ジェニー・オライリー

2
@ JennyO'Reillyこれを回答として投稿してください。私のユースケースと完全に一致しました。感謝
rob

2
パフォーマンステスト:jsperf.com/adding-element-to-the-array-start しかし、結果はブラウザーごとに異なります。
Avernikoz

回答:


2812

を使用しunshiftます。push要素を配列の最後ではなく最初に追加することを除けば、に似ています。

  • unshift/ push-配列の最初/最後に要素を追加します
  • shift/ pop -配列の最初/最後の要素を削除して返します

簡単な図...

   unshift -> array <- push
   shift   <- array -> pop

とチャート:

          add  remove  start  end
   push    X                   X
    pop           X            X
unshift    X             X
  shift           X      X

MDNアレイのドキュメントを確認してください。配列から要素をプッシュ/ポップする機能を持つ事実上すべての言語には、要素をシフト解除/シフト(時々push_front/ と呼ばれるpop_front)する機能もあります。これらを自分で実装する必要はありません。


コメントで指摘したように、元の配列の変更を避けたい場合はconcat、2つ以上の配列を連結するを使用できます。これを使用して、既存の配列の前面または背面に単一の要素を機能的にプッシュできます。そのためには、新しい要素を単一の要素配列に変換する必要があります。

const array = [ 3, 2, 1 ]

const newFirstElement = 4

const newArray = [newFirstElement].concat(array) // [ 4, 3, 2, 1 ]

concatアイテムを追加することもできます。への引数concatは任意のタイプにすることができます。それらがまだ配列でない場合、それらは暗黙的に単一要素配列にラップされます。

const array = [ 3, 2, 1 ]

const newLastElement  = 0

// Both of these lines are equivalent:
const newArray1 = array.concat(newLastElement)   // [ 3, 2, 1, 0 ]
const newArray2 = array.concat([newLastElement]) // [ 3, 2, 1, 0 ]

51
concat新しい配列を返すため、使用することをお勧めします。連鎖に非常に役立ちます。 [thingToInsertToFront].concat(originalArray).reduce(fn).reverse().map(fn)など...を使用する場合unshift、取得できるのは長さだけなので、その連鎖を行うことはできません。
StJohn3D 2016

4
シフト/シフト解除、プッシュ/ポップ、スプライス。そのようなメソッドの非常に論理的な名前。
linuxunil 2018

1398

配列演算イメージ

var a = [23, 45, 12, 67];
a.unshift(34);
console.log(a); // [34, 23, 45, 12, 67]


117
日常的に使用される4つの関数について視覚的なガイドラインが必要なのは、暗号化された関数名が原因です... unshiftがInsertと呼ばれないのはなぜですか?シフトは削除する必要があります。etc ...
Pascal

76
// unshiftがInsertと呼ばれていないのはなぜですか?//これは、配列要素がスタックのように扱われたCプログラミング言語の規則に由来しています。(完全な説明についてはperlmonks.org/?node_id=613129を参照してください)
dreftymac '26 / 07/26

25
@Pascalいいえ、挿入と削除は特に悪い名前です。アレイの前面から追加/削除するのではなく、ランダムアクセスを意味します
わずか

25
unshiftは最初のキーを削除し、shiftは最初のキーに挿入すると考えていましたが、それは私の一般的な考えにすぎません
Shannon Hochkins

27
私はDNAリファレンスが好きです
Hunter WebDev 2016年

235

ES6では、spread演算子を使用します...

デモ

var arr = [23, 45, 12, 67];
arr = [34, ...arr]; // RESULT : [34,23, 45, 12, 67]

console.log(arr)


19
また、純粋な関数に役立つ新しい配列も作成します
devonj

ここでのパフォーマンスの影響は何ですか?unshift()を使用するよりも遅いですか?
Peter

1
確かに、それは不変の配列であるため、遅くなります(新しい配列を作成する)。大きなアレイで作業している場合、またはパフォーマンスが最初の要件である場合は、concat代わりに使用することを検討してください。
Abdennour TOUMI 2018年

2018年はパフォーマンスは重要ではなく、ブラウザーとノードの新しいバージョンでも同じパフォーマンスが得られます
stackdave

75

それを行う別の方法 concat

var arr = [1, 2, 3, 4, 5, 6, 7];
console.log([0].concat(arr));

違いconcatとはunshiftつまりconcat、新しい配列を返します。それらの間のパフォーマンスはここで見つけることができます

function fn_unshift() {
  arr.unshift(0);
  return arr;
}

function fn_concat_init() {
  return [0].concat(arr)
}

テスト結果はこちら

ここに画像の説明を入力してください


参照を追加することとは別に、両方のパフォーマンス比較を追加すると答えが得られます。
Ivan De Paz Centeno 2016年

私はちょうど得た私たちはV2をリリースで作業している間、jsPerfが一時的に利用できません。後でリンクからもう一度お試しください。結果にリンクする代わりに結果を含めるもう1つの理由。
Tigger

jsPrefの結果:: unshift25,510±3.18%99%遅い concat:2,436,894±3.39%最速
Illuminator

最新のSafariでは、fn_unshift()がより高速に実行されます。
passatgt 2017

最新のSafari(v 10)では、fn_unshift()が再び遅くなります。
rmcsharry

45

クイックチートシート:

シフト/アンシフトおよびプッシュ/ポップという用語は、少なくともCでのプログラミングに慣れていない人にとっては、少しわかりにくいかもしれません。

専門用語に慣れていない場合は、代替用語の簡単な翻訳を以下に示します。覚えやすいでしょう。

* array_unshift()  -  (aka Prepend ;; InsertBefore ;; InsertAtBegin )     
* array_shift()    -  (aka UnPrepend ;; RemoveBefore  ;; RemoveFromBegin )

* array_push()     -  (aka Append ;; InsertAfter   ;; InsertAtEnd )     
* array_pop()      -  (aka UnAppend ;; RemoveAfter   ;; RemoveFromEnd ) 

20

あなたは配列を持っています: var arr = [23, 45, 12, 67];

最初にアイテムを追加するには、次のように使用しますsplice

var arr = [23, 45, 12, 67];
arr.splice(0, 0, 34)
console.log(arr);


arr.splice(0、arr.length、34);
Lior Elrom、2015年

1
@LiorElromあなたのスニペットは何をしますか?
Janus Troelsen

@poushyブラウザ固有です。Firefox54ではunshift50%高速です(ただし、ほとんどの場合より読みやすくなっています)
icl7126

@poushyもうありません。遅い。
Andrew

17

Mutateなし

実際には、すべてのunshift/ pushshift/ pop 変異する起源配列を。

unshift/ push開始/終了から存在していた配列に項目を追加して、shift/ pop配列の先頭/末尾から項目を削除します。

ただし、変更なしで配列に項目を追加する方法はいくつかあります。結果は新しい配列です。配列の最後に追加するには、以下のコードを使用します。

const originArray = ['one', 'two', 'three'];
const newItem = 4;

const newArray = originArray.concat(newItem); // ES5
const newArray2 = [...originArray, newItem]; // ES6+

元の配列の先頭に追加するには、以下のコードを使用します。

const originArray = ['one', 'two', 'three'];
const newItem = 0;

const newArray = (originArray.slice().reverse().concat(newItem)).reverse(); // ES5
const newArray2 = [newItem, ...originArray]; // ES6+

上記の方法で、変異なしで配列の最初/最後に追加します。


slice関数の最後に関数を置いて、変更originArrayできないようにしています。
Ahmad Khani

1
驚くばかり!(Redux)状態管理になると...この答えは貴重です!
ペドロフェレイラ

1
これは正しい方法です!
mmm

10

ES6の構造化解除を使用する:(元のアレイからの変異を避ける)

const newArr = [item, ...oldArr]



8

配列の先頭に要素を継続的に挿入する必要がある場合は、常にpush呼び出すのでreverseはなく、ステートメントを使用してからを呼び出す方が高速unshiftです。

ベンチマークテスト: http : //jsben.ch/kLIYf


1
注:初期配列は空でなければなりません。
192kb

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.