J'ai un tableau JavaScript dataArray
que je veux insérer dans un nouveau tableau newArray
. Sauf que je ne veux newArray[0]
pas l'être dataArray
. Je veux insérer 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
);
Alors maintenant, le nouveau tableau contient toutes les valeurs des tableaux de données individuels. Y a-t-il des raccourcis comme pushValues
disponibles, donc je n'ai pas à répéter sur chaque individu dataArray
, en ajoutant les éléments un par un?
Réponses:
Utilisez la fonction concat , comme ceci:
La valeur de
newArray
sera[1, 2, 3, 4]
(arrayA
etarrayB
restera inchangée;concat
crée et renvoie un nouveau tableau pour le résultat).la source
Google Chrome
: rapide (concat = gagnant)Opera
,: rapide (concat = gagnant)IE
,: plus lent (concat = gagnant)Firefox
,: lent (push.apply = gagnant, mais 10 fois plus lent que le concat de Chrome) ... parler de mauvaise implémentation du moteur JS .push
ne pas aplatir un tableau de valeurs.concat
réalise ce que la question requiert.À condition que vos tableaux ne soient pas énormes (voir la mise en garde ci-dessous), vous pouvez utiliser la
push()
méthode du tableau auquel vous souhaitez ajouter des valeurs.push()
peut prendre plusieurs paramètres afin que vous puissiez utiliser saapply()
méthode pour passer le tableau de valeurs à pousser comme une liste de paramètres de fonction. Cela a l'avantage par rapport à l'concat()
ajout d'é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.
Vous voudrez peut-être généraliser cela en une fonction:
... ou ajoutez-le au
Array
prototype de:... ou émuler la
push()
méthode d' origine en autorisant plusieurs paramètres en utilisant le fait queconcat()
, commepush()
, permet plusieurs paramètres:Voici une version en boucle du dernier exemple, adaptée aux grands tableaux et à tous les principaux navigateurs, y compris IE <= 8:
la source
newArray.push.apply(newArray, dataArray1);
donne la même chose queArray.prototype.push.applay(newArray,dataArra1);
Array.prototype.concat
n'est pas mauvais, il est plutôt simplement mal compris et parfois mal utilisé. Dans ces circonstances, il est seulement mal compris, mais pas mal utilisé.Je vais ajouter une autre réponse "à l'épreuve du temps"
Dans ECMAScript 6, vous pouvez utiliser la syntaxe Spread :
La syntaxe de propagation n'est pas encore incluse dans tous les principaux navigateurs. Pour la compatibilité actuelle, consultez ce tableau de compatibilité (continuellement mis à jour) .
Vous pouvez cependant utiliser la syntaxe étendue avec Babel.js .
Éditer:
Voir la réponse de Jack Giffin ci-dessous pour plus de commentaires sur les performances. Il semble que le concat est encore meilleur et plus rapide que l'opérateur de propagation.
la source
newArray.apply(newArray, dataArray1)
.Trouvé une manière élégante de MDN
Ou vous pouvez utiliser la
spread operator
fonctionnalité d'ES6:la source
Est-ce que cela résout votre problème?
la source
Ce qui me semble le plus simple:
Comme "push" prend un nombre variable d'arguments, vous pouvez utiliser la
apply
méthode de lapush
fonction pour pousser tous les éléments d'un autre tableau. Il construit un appel à pousser en utilisant son premier argument ("newArray" ici) comme "this" et les éléments du tableau comme arguments restants.Dans
slice
la première instruction obtient une copie du premier tableau, donc vous ne le modifiez pas.Mise à jour Si vous utilisez une version de javascript avec une tranche disponible, vous pouvez simplifier
push
expression pour:la source
La fonction ci-dessous n'a pas de problème avec la longueur des tableaux et fonctionne mieux que toutes les solutions suggérées:
malheureusement, jspref refuse d'accepter mes soumissions, alors voici les résultats en utilisant benchmark.js
où
pour boucle et push est:
Appuyez sur Appliquer:
opérateur de spread:
et enfin la «longueur définie et pour la boucle» est la fonction ci-dessus
la source
𝗥𝗲𝘀𝗲𝗮𝗿𝗰𝗵 𝗔𝗻𝗱 𝗥𝗲𝘀𝘂𝗹𝘁𝘀
Pour les faits, un test de performance sur jsperf et une vérification de certaines choses dans la console sont effectués. Pour la recherche, le site Internet irt.org est utilisé. Vous trouverez ci-dessous une collection de toutes ces sources ainsi qu'un exemple de fonction en bas.
Comme vu ci-dessus, je dirais que Concat est presque toujours la voie à suivre pour les performances et la capacité à conserver la rareté des tableaux de rechange. Ensuite, pour les tableaux comme (comme DOMNodeLists comme
document.body.children
), je recommanderais d'utiliser la boucle for car c'est à la fois la 2e méthode la plus performante et la seule autre méthode qui conserve des tableaux clairsemés. Ci-dessous, nous passerons rapidement en revue ce que l'on entend par tableaux clairsemés et tableaux similaires pour dissiper la confusion.𝗧𝗵𝗲 𝗙𝘂𝘁𝘂𝗿𝗲
Au début, certaines personnes peuvent penser qu'il s'agit d'un hasard et que les fournisseurs de navigateurs finiront par optimiser l'optimisation d'Array.prototype.push pour être suffisamment rapide pour battre Array.prototype.concat. FAUX! Array.prototype.concat sera toujours plus rapide (en principe au moins) car il s'agit d'un simple copier-coller sur les données. Vous trouverez ci-dessous un diagramme persuado-visuel simplifié de ce à quoi pourrait ressembler une implémentation de tableau 32 bits (veuillez noter que les implémentations réelles sont BEAUCOUP plus compliquées)
Comme vu ci-dessus, tout ce que vous devez faire pour copier quelque chose comme ça est presque aussi simple que de le copier octet par octet. Avec Array.prototype.push.apply, c'est bien plus qu'un simple copier-coller sur les données. Le ".apply" doit vérifier chaque index du tableau et le convertir en un ensemble d'arguments avant de le passer à Array.prototype.push. Ensuite, Array.prototype.push doit en outre allouer plus de mémoire à chaque fois, et (pour certaines implémentations de navigateur), peut-être même recalculer certaines données de recherche de position pour la rareté.
Une autre façon d'y penser est la suivante. Le tableau source est une grande pile de papiers agrafés ensemble. Le tableau source deux est également une autre grande pile de papiers. Serait-il plus rapide pour vous de
Dans l'analogie ci-dessus, l'option # 1 représente Array.prototype.concat tandis que # 2 représente Array.prototype.push.apply. Essayons cela avec un JSperf similaire qui ne diffère que par le fait que celui-ci teste les méthodes sur des tableaux clairsemés, pas des tableaux solides. On peut le trouver ici .
Par conséquent, je me repose sur le fait que l'avenir des performances pour ce cas d'utilisation particulier ne réside pas dans Array.prototype.push, mais plutôt dans Array.prototype.concat.
𝗖𝗹𝗮𝗿𝗶𝗳𝗶𝗰𝗮𝘁𝗶𝗼𝗻𝘀
𝗦𝗽𝗮𝗿𝗲 𝗔𝗿𝗿𝗮𝘆𝘀
Lorsque certains membres du tableau sont simplement manquants. Par exemple:
Alternativement, javascript vous permet d'initialiser facilement des tableaux de rechange.
𝗔𝗿𝗿𝗮𝘆-𝗟𝗶𝗸𝗲𝘀
Un tableau-comme est un objet qui a au moins une
length
propriété, mais n'a pas été initialisé avecnew Array
ou[]
; Par exemple, les objets ci-dessous sont classés comme des tableaux.Observez ce qui se passe en utilisant une méthode qui contraint les tableaux comme des tableaux comme des tranches.
Afficher l'extrait de code
Observez ce qui se passe en utilisant une méthode qui ne contraint pas les tableaux comme dans des tableaux comme concat.
Afficher l'extrait de code
la source
Avec JavaScript ES6, vous pouvez utiliser l'opérateur ... comme opérateur d'étalement qui convertira essentiellement le tableau en valeurs. Ensuite, vous pouvez faire quelque chose comme ceci:
Bien que la syntaxe soit concise, je ne sais pas comment cela fonctionne en interne et quelles sont les implications en termes de performances sur les grands tableaux.
la source
Array.push.apply
technique.Voici la manière ES6
la source
Il existe un certain nombre de réponses concernant Array.prototype.push.apply . Voici un exemple clair:
Si vous avez la syntaxe ES6:
la source
Si vous souhaitez modifier le tableau d'origine, vous pouvez étaler et pousser:
Si vous voulez vous assurer que seuls les éléments du même type entrent dans le
source
tableau (sans mélanger les nombres et les chaînes par exemple), utilisez alors TypeScript.la source
Nous avons deux tableaux a et b. le code qui a fait ici est tableau une valeur est poussée dans le tableau b.
la source
Essaye ça:
la source
au lieu de la fonction push (), utilisez la fonction concat pour IE. exemple,
la source
Ceci est un code de travail et il fonctionne très bien:
la source