JavaScriptの配列dataArray
があり、それを新しい配列newArray
に押し込みたいと思っています。ただし、newArray[0]
をdataArray
にしたいわけではありません。すべてのアイテムを新しい配列にプッシュしたいのです。
var newArray = [];
newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...
あるいはもっと良い方法があります。
var newArray = new Array (
dataArray1.values(),
dataArray2.values(),
// ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);
このように、新しい配列には個々のデータ配列のすべての値が含まれています。 pushValuesのような略記法があれば、個々の
dataArray`を反復してアイテムを1つずつ追加する必要はないのでしょうか?
配列が巨大でなければ(下記の注意点を参照),値を追加したい配列の push()
メソッドを使うことができます.push()は複数のパラメータを取ることができるので,その
apply()メソッドを使って,プッシュされる値の配列を関数のパラメータのリストとして渡すことができます。これは,
concat()`を使う場合と比べて,新しい配列を作るのではなく,その場で配列に要素を追加できるという利点があります。
しかし,大規模な配列(10万メンバー以上のオーダー)では,このトリックは失敗することがあるようです。このような配列では,ループを使用するのが良い方法です.詳細は https://stackoverflow.com/a/17368101/96100 を参照してください。
var newArray = [];
newArray.push.apply(newArray, dataArray1);
newArray.push.apply(newArray, dataArray2);
これを関数に一般化するといいかもしれません。
function pushArray(arr, arr2) {
arr.push.apply(arr, arr2);
}
... または Array
のプロトタイプに追加してください。
Array.prototype.pushArray = function(arr) {
this.push.apply(this, arr);
};
var newArray = [];
newArray.pushArray(dataArray1);
newArray.pushArray(dataArray2);
... あるいは、push()
と同様に concat()
が複数のパラメータを許可していることを利用して、複数のパラメータを許可することで、オリジナルの push()
メソッドをエミュレートします。
Array.prototype.pushArray = function() {
this.push.apply(this, this.concat.apply([], arguments));
};
var newArray = [];
newArray.pushArray(dataArray1, dataArray2);
先ほどの例をループベースにしたもので、大きな配列や、IE <= 8を含むすべての主要ブラウザに対応しています。
Array.prototype.pushArray = function() {
var toPush = this.concat.apply([], arguments);
for (var i = 0, len = toPush.length; i < len; ++i) {
this.push(toPush[i]);
}
};