Copiar itens de matriz para outra matriz

Eu tenho um array JavaScript dataArray que eu quero empurrar para um novo array newArray. Exceto que eu não'não quero que o newArray[0]newArraysejadataArray`. Eu quero empurrar todos os itens para o novo array:

var newArray = [];

newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...

ou ainda melhor:

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
);

Então agora a nova matriz contém todos os valores das matrizes de dados individuais. Existe algum estorno como pushValues disponível para que eu não'não tenha que iterar sobre cada dataArray individual, adicionando os itens um por um?

Solução

Use a função concat, assim:

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

O valor de newArray será [1, 2, 3, 4](arrayA e arrayB permanecem inalterados; concat cria e retorna um novo array para o resultado).

Comentários (10)

Desde que suas arrays não sejam enormes (veja a advertência abaixo), você pode utilizar o método push() do array ao qual você deseja anexar valores. O push() pode pegar múltiplos parâmetros para que você possa utilizar seu método apply() para passar o array de valores a serem empurrados como uma lista de parâmetros de funções. Isto tem a vantagem sobre a utilização do concat() de adicionar elementos ao array no lugar ao invés de criar um novo array.

No entanto, parece que para grandes conjuntos (da ordem de 100.000 membros ou mais), ** este truque pode falhar***. Para tais arrays, usar um loop é uma abordagem melhor. Veja https://stackoverflow.com/a/17368101/96100 para detalhes.

var newArray = [];
newArray.push.apply(newArray, dataArray1);
newArray.push.apply(newArray, dataArray2);

Talvez queira generalizar isto para uma função:

function pushArray(arr, arr2) {
    arr.push.apply(arr, arr2);
}

... ou adicioná-lo ao protótipo do 'Array':

Array.prototype.pushArray = function(arr) {
    this.push.apply(this, arr);
};

var newArray = [];
newArray.pushArray(dataArray1);
newArray.pushArray(dataArray2);

... ou emular o método original push(), permitindo múltiplos parâmetros utilizando o fato de que concat(), como push(), permite múltiplos parâmetros:

Array.prototype.pushArray = function() {
    this.push.apply(this, this.concat.apply([], arguments));
};

var newArray = [];
newArray.pushArray(dataArray1, dataArray2);

Aqui está uma versão em loop do último exemplo, adequada para grandes arrays e todos os principais navegadores, incluindo o IE

Comentários (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)

Isso resolve o seu problema?

Comentários (0)