配列のアイテムを別の配列にコピーする

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つずつ追加する必要はないのでしょうか?

ソリューション

concat]1関数を使って、次のようにします。

var arrayA = [1, 2];
var arrayB = [3, 4];
var newArray = arrayA.concat(arrayB);

newArrayの値は[1, 2, 3, 4]となる(arrayAarrayBは変更されず、concat` は結果として新しい配列を作成して返す)。

解説 (10)

配列が巨大でなければ(下記の注意点を参照),値を追加したい配列の 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)
var a=new Array('a','b','c');
var b=new Array('d','e','f');
var d=new Array('x','y','z');
var c=a.concat(b,d)

これで問題は解決しましたか?

解説 (0)