複数の要素を配列にプッシュする


284

複数の要素を1つの配列としてプッシュしようとしていますが、エラーが発生します

> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined

私は私が考えていた、私はルビーでやるだろうと同様のものをやろうとしているapplyようなものです*

>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]

回答:


240

applyまたはでオブジェクトのほとんどの機能を使用する場合callcontextパラメーターは作業中のオブジェクトでなければなりません。

この場合、あなたはa.push.apply(a, [1,2])(またはより正確にArray.prototype.push.apply(a, [1,2]))必要です


616

次の方法で配列に複数の要素をプッシュできます

var a = [];
    
a.push(1, 2, 3);

console.log(a);


1
この回答と選択された回答は、異なる、おそらく予期しない結果をもたらします。a.push(1)とa.push([1])の
比較

1
誰もが説明できますか、なぜこれが受け入れられた回答よりもはるかに多くの票を持っているのですか?簡単かもしれませんが、柔軟性が低くなります。2つの配列をマージする場合、これは機能しません。
BluE

@BluE 2つの配列をマージしたい場合は、array.concat()を使用してください
Florent Arlandis

@FlorentArlandis array.concatは、2番目の配列を最初の配列に追加するように機能しません。新しいものを作成します。私はそれが似ていることを知っています。スプレッド演算子は私が探していたものです。詳細については、他の回答とコメントをご覧ください。
BluE

435

ECMAScript2015(別名ES6)では、spreadオペレーターを使用して複数のアイテムを一度に追加できます。

var arr = [1];
var newItems = [2, 3];
arr.push(...newItems);
console.log(arr);

参照してくださいKangaxのES6互換ブラウザは互換性があるかを確認するために、テーブルを


41
whaaaaaaatこれは素晴らしいです。加えて、typescriptで実行するとpush.applyにコンパイルされるため、下位互換性があります
Chris

72

使用できますArray.concat

var result = a.concat(b);

16
Array.prototype.concatは新しい配列を返します。
suricactus

12
彼は既存のアレイにプッシュしたいのでArray.prototype.push.apply(arr1, arr2)正しい答えarr1.concat(arr2)です。あなたが使っているのは新しいアレイを作成しているからです。
suricactus

3
@suricactus arr1 = arr1.concat(arr2)は大したことではなく、よりすっきりしているように見えます。古いアレイへのプッシュまたは古いアレイの新しいアレイへの置き換えは、ニーズによって異なります。10m以上の要素を処理する場合、古い配列へのプッシュはより速く機能します。小さなチャンクを管理する場合、速度の違いはほとんど見つかりません。どちらのオプションも完全に合法です。
VisioN 2015

5
@YuvalA。1回prototype.push.applyだけ呼び出しますpush。また、上記の区別は速度については必要ありませんが、インプレース操作と新しいアレイの作成については必要ありません。配列を取得するメソッドがあり、それをインプレースで変更する必要がある場合はどうなりますか?concatそれは関数の呼び出し元の変数を変更しないので、この方法は、可能性もVisionNのコードで、動作することはできません。
coderforlife 2016

1
a = a.concat(b)構文はまだより短い構文ですArray.prototype.push.apply(arr1, arr2)
Aizzat Suhardi 2017年

22

Array.concatECMAScript 2015(別名ES6、ES2015)の代わりに、配列を変更せずに新しい配列を返すような方法が必要な場合は、次のようにスプレッド演算子を使用できます。

var arr = [1];
var newItems = [2, 3];
var newerItems = [4, 5];
var newArr = [...arr, ...newItems, ...newerItems];
console.log(newArr);

メソッドは配列を変更または変更するため、これはpushメソッドとは異なりpushます。

特定のES2015機能がブラウザーで機能するかどうかを確認する場合は、Kangaxの互換性表を確認してください。

ブラウザのサポートを待たずにES2015を本番環境で使用したい場合は、Babelまたは同様のトランスパイラーを使用することもできます。


4

使用をお勧めする多くの回答がありますArray.prototype.push(a, b)。それは良い方法です、しかし、あなたが本当に大きなBを持っている場合、あなたは(理由は、あまりにも多くの引数の)スタックオーバーフローエラーになります。ここで注意してください。

N個の配列を連結する最も効率的な方法は何ですか?を参照してください詳細については。


3
これは質問に対する答えを提供しません。批評したり、著者に説明を求めるには、投稿の下にコメントを残してください。[良い答えを書くにはどうすればよいですか?](stackoverflow.com/help/how-to-answer
mrun 2018

1
申し訳ありませんが、評判が不十分なため、回答の下にコメントを残すことはできません(自分のコメントを除く)。しかし、これは完全な概要を持つためにここで言及されるべきであるようです。やってくれませんか?その後、私の答えを削除します。
2018

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