pousser plusieurs éléments dans le tableau


286

J'essaie de pousser plusieurs éléments en un seul tableau, mais j'obtiens une erreur

> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined

J'essaie de faire des trucs similaires que je ferais en rubis, je pensais que c'était applyquelque chose comme ça *.

>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]

Réponses:


241

Lorsque vous utilisez la plupart des fonctions d'objets avec applyou call, le contextparamètre DOIT être l'objet sur lequel vous travaillez.

Dans ce cas, vous avez besoin a.push.apply(a, [1,2])(ou plus correctement Array.prototype.push.apply(a, [1,2]))


620

Vous pouvez pousser plusieurs éléments dans un tableau de la manière suivante

var a = [];
    
a.push(1, 2, 3);

console.log(a);


1
Cette réponse et la réponse sélectionnée produisent des résultats différents, et peut-être inattendus. a.push (1) contre a.push ([1])
oevna

1
Quelqu'un peut-il expliquer pourquoi cela a autant de voix que la réponse acceptée? C'est peut-être plus facile, mais c'est moins flexible. Si vous souhaitez fusionner 2 tableaux, cela ne fonctionnera pas.
BluE

@BluE si vous voulez fusionner deux tableaux, utilisez simplement array.concat ()
Florent Arlandis

@FlorentArlandis array.concat ne fonctionne pas pour ajouter le 2ème tableau au premier. Il en créera un nouveau. Je sais que c'est similaire. L'opérateur de spread est ce que je cherchais. Regardez les autres réponses et commentaires pour plus de détails.
BluE

436

Maintenant, dans ECMAScript2015 (aka ES6), vous pouvez utiliser l' opérateur de propagation pour ajouter plusieurs éléments à la fois:

var arr = [1];
var newItems = [2, 3];
arr.push(...newItems);
console.log(arr);

Consultez le tableau de compatibilité ES6 de Kangax pour voir quels navigateurs sont compatibles


41
whaaaaaaat c'est génial, de plus, si vous le faites en tapuscrit, il se compilera pour push.apply afin que vous ayez une compatibilité descendante
Chris

72

Vous pouvez utiliser Array.concat:

var result = a.concat(b);

16
Array.prototype.concat renvoie un nouveau tableau.
suricactus

12
Il veut pousser vers le tableau existant, Array.prototype.push.apply(arr1, arr2)c'est donc la bonne réponse, car en utilisant arr1.concat(arr2)vous créez un nouveau tableau.
suricactus

3
@suricactus arr1 = arr1.concat(arr2)n'est pas un gros problème et semble beaucoup plus propre. Pousser vers l'ancienne baie ou remplacer l'ancienne baie par la nouvelle dépend de vos besoins. Si vous traitez avec des éléments de plus de 10m, le fait de pousser vers un ancien tableau fonctionnera plus rapidement, si vous gérez de petits morceaux, vous ne trouverez pratiquement aucune différence de vitesse. Les deux options sont complètement légitimes.
VisioN

5
@YuvalA. prototype.push.applyappelle pushune seule fois. Et la distinction ci-dessus n'est pas nécessaire à propos de la vitesse mais d'une opération sur place par rapport à la création d'un nouveau tableau. Et si j'avais une méthode qui prenait un tableau et était censé le modifier sur place? La concatméthode ne peut pas fonctionner, même avec le code de VisionN car elle ne modifiera pas la variable pour l'appelant de la fonction.
coderforlife

1
a = a.concat(b)est toujours une syntaxe plus courte queArray.prototype.push.apply(arr1, arr2)
Aizzat Suhardi

22

Si vous voulez une alternative à Array.concatdans ECMAScript 2015 (aka ES6, ES2015) qui, comme elle, ne modifie pas le tableau mais renvoie un nouveau tableau, vous pouvez utiliser l' opérateur de propagation comme ceci:

var arr = [1];
var newItems = [2, 3];
var newerItems = [4, 5];
var newArr = [...arr, ...newItems, ...newerItems];
console.log(newArr);

Notez que ceci est différent de la pushméthode car la pushméthode mute / modifie le tableau.

Si vous voulez voir si certaines fonctionnalités ES2015 fonctionnent dans votre navigateur, consultez le tableau de compatibilité de Kangax .

Vous pouvez également utiliser Babel ou un transpilateur similaire si vous ne souhaitez pas attendre la prise en charge du navigateur et souhaitez utiliser ES2015 en production.


4

Il y a beaucoup de réponses recommandons d'utiliser: Array.prototype.push(a, b). C'est sympa, MAIS si vous avez vraiment un gros b, vous aurez une erreur de débordement de pile (à cause de trop d'arguments). Faites attention ici.

Voir Quelle est la manière la plus efficace de concaténer des tableaux N? pour plus de détails.


3
Cela ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article. [Comment écrire une bonne réponse? ] ( stackoverflow.com/help/how-to-answer )
mrun

1
Désolé, je ne peux pas laisser de commentaires sous les réponses (sauf la mienne) à cause de la réputation insuffisante :). Mais il semble que cela devrait être mentionné ici pour avoir un aperçu complet. Pourriez-vous s'il vous plaît le faire pour moi? Ensuite, je vais supprimer ma réponse.
12kb le

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.