Vous devez utiliser une technique basée sur les boucles. D'autres réponses sur cette page qui sont basées sur l'utilisation de .apply
peut échouer pour les grandes matrices.
Une implémentation assez laconique basée sur les boucles est :
Array.prototype.extend = function (other_array) {
/* You should include a test to check whether other_array really is an array */
other_array.forEach(function(v) {this.push(v)}, this);
}
Vous pouvez alors procéder comme suit :
var a = [1,2,3];
var b = [5,4,3];
a.extend(b);
La réponse de DzinX (en utilisant push.apply) et d'autres .apply
échouent lorsque le tableau que nous ajoutons est de grande taille (les tests montrent que pour moi, la taille est > 150 000 entrées environ dans Chrome, et > 500 000 entrées dans Firefox). Vous pouvez voir cette erreur se produire dans ce jsperf .
Une erreur se produit car la taille de la pile d'appels est dépassée lorsque 'Function.prototype.apply' est appelé avec un grand tableau comme deuxième argument. (Le MDN contient une note sur les dangers du dépassement de la taille de la pile d'appel lors de l'utilisation de l'option Function.prototype.apply - voir la section intitulée "appliquer et fonctions intégrées").
Pour une comparaison de vitesse avec d'autres réponses sur cette page, voir ce jsperf (merci à EaterOfCode). L'implémentation basée sur les boucles est similaire en vitesse à l'utilisation de Array.push.apply
mais a tendance à être un peu plus lent que l'option Array.slice.apply
.
Il est intéressant de noter que si le tableau que vous ajoutez est clairsemé, la fonction forEach
ci-dessus peut tirer parti de la sparsité et surpasser la méthode de la .apply
des méthodes basées sur l'expérience ; consultez ce jsperf si vous voulez tester cela par vous-même.
À propos, ne soyez pas tenté (comme je l'ai été !) de raccourcir encore l'implémentation de forEach en :
Array.prototype.extend = function (array) {
array.forEach(this.push, this);
}
car cela donne des résultats dérisoires ! Pourquoi ? Parce que Array.prototype.forEach
fournit trois arguments à la fonction qu'il appelle - ceux-ci sont : (element_value, element_index, source_array). Tous ces arguments seront poussés dans votre premier tableau à chaque itération de la fonction forEach
si vous utilisez "forEach(this.push, this)" !
9 votes
D'après le commentaire de @Toothbrush sur une réponse :
a.push(...b)
. Son concept est similaire à celui de la réponse précédente, mais il a été mis à jour pour ES6.0 votes
>>> a.push(...b)