Copier les éléments d'un tableau dans un autre tableau

J'ai un tableau JavaScript dataArray que je veux pousser dans un nouveau tableau newArray. Sauf que je ne veux pas que newArray[0] soit dataArray. Je veux pousser tous les éléments dans le nouveau tableau :

var newArray = [];

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

ou encore mieux :

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

Ainsi, le nouveau tableau contient toutes les valeurs des tableaux de données individuels. Existe-t-il un raccourci comme pushValues pour que je n'aie pas à itérer sur chaque dataArray individuel, en ajoutant les éléments un par un ?

Solution

Utilisez la fonction [concat][1], comme suit :

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

La valeur de newArray sera [1, 2, 3, 4] (arrayA et arrayB restent inchangés ; concat crée et retourne un nouveau tableau pour le résultat).

[1] : https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/concat

Commentaires (10)

Si vos tableaux ne sont pas énormes (voir l'avertissement ci-dessous), vous pouvez utiliser la méthode push() du tableau auquel vous souhaitez ajouter des valeurs. push() peut prendre plusieurs paramètres, vous pouvez donc utiliser sa méthode apply() pour passer le tableau de valeurs à pousser comme une liste de paramètres de fonction. Cela présente l'avantage, par rapport à l'utilisation de concat(), d'ajouter des éléments au tableau en place plutôt que de créer un nouveau tableau.

Cependant, il semble que pour les grands tableaux (de l'ordre de 100 000 membres ou plus), cette astuce peut échouer. Pour de tels tableaux, l'utilisation d'une boucle est une meilleure approche. Voir https://stackoverflow.com/a/17368101/96100 pour plus de détails.

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

Vous pourriez vouloir généraliser ceci en une fonction :

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

... ou l'ajouter au prototype de Array's :

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

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

... ou émuler la méthode originale push() en autorisant plusieurs paramètres en utilisant le fait que concat(), comme push(), autorise plusieurs paramètres :

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

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

Voici une version en boucle du dernier exemple, adaptée aux grands tableaux et à tous les principaux navigateurs, y compris IE

Commentaires (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)

Cela résout-il votre problème ?

Commentaires (0)