Quelle est la manière la plus efficace d'insérer un tableau dans un autre tableau.
a1 = [1,2,3,4,5];
a2 = [21,22];
newArray - a1.insertAt(2,a2) -> [1,2, 21,22, 3,4,5];
Itérer a2 à l'aide de splice semble un peu mauvais du point de vue des performances si le tableau a2 est grand.
Merci.
Réponses:
Vous pouvez utiliser
splice
combiné avec uneapply
astuce:Dans ES2015 +, vous pouvez utiliser l'opérateur de diffusion à la place pour rendre cela un peu plus agréable
la source
apply
, une exception stackoverflow sera générée. jsfiddle.net/DcHCY Se produit également dans jsPerf Je crois en FF et IE le seuil est d'environ 500ktarget.slice(0, insertIndex).concat(insertArr, target.slice(insertIndex));
jsperf.com/inserting-an-array-within-an-arrayVous pouvez maintenant le faire si vous utilisez ES2015 ou une version ultérieure:
Reportez-vous à ceci pour la documentation sur l'opérateur spread (...) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
la source
J'avais tort au début. J'aurais dû utiliser à la
concat()
place.Exemple: http://jsfiddle.net/f3cae/1/
Cette expression utilise
slice(0, 2)
[docs] pour renvoyer les deux premiers éléments dea1
(où0
est l'index de départ et2
est l'élément deleteCount, bien qu'ila1
ne soit pas modifié).Résultat intermédiaire :
[1,2]
Il utilise ensuite
concat(a2)
[docs] pour ajoutera2
à la fin du fichier[1,2]
.Résultat intermédiaire :
[1,2,21,22]
.Ensuite,
a1.slice(2)
est appelé dans une fin.concat()
à la fin de cette expression, ce qui équivaut à[1,2,21,22].concat(a1.slice(2))
.Un appel à
slice(2)
, ayant un argument entier positif, retournera tous les éléments après le 2ème élément, en comptant par des nombres naturels (comme dans, il y a cinq éléments, donc[3,4,5]
sera retourné à partir dea1
). Une autre façon de dire cela est que l'argument d'index de nombre entier singulier indiquea1.slice()
à quelle position dans le tableau commencer à renvoyer des éléments (l'index 2 est le troisième élément).Résultat intermédiaire :
[1,2,21,22].concat([3,4,5])
Enfin, le second
.concat()
ajoute[3,4,5]
à la fin de[1,2,21,22]
.Résultat :
[1,2,21,22,3,4,5]
Il peut être tentant de modifier
Array.prototype
, mais on peut simplement étendre l'objet Array en utilisant l'héritage prototypique et injecter ledit nouvel objet dans vos projets.Cependant, pour ceux qui vivent à la limite ...
Exemple: http://jsfiddle.net/f3cae/2/
la source
L' opérateur spread permet à une expression d'être développée aux endroits où plusieurs arguments (pour les appels de fonction) ou plusieurs éléments (pour les littéraux de tableau) sont attendus.
la source
Il y a ici des réponses vraiment créatives à cette question. Voici une solution simple pour ceux qui débutent avec les tableaux. Il peut être conçu pour fonctionner jusqu'aux navigateurs compatibles ECMAScript 3, si vous le souhaitez.
Sachez quelque chose sur l'épissure avant de commencer.
Réseau de développeurs Mozilla: Array.prototype.splice ()
Tout d'abord, comprenez deux formes importantes de
.splice()
.Méthode 1) Supprimez les éléments x (deleteCount), à partir d'un index souhaité.
Méthode 2) Supprimez les éléments après un index de début souhaité jusqu'à la fin du tableau.
En utilisant
.splice()
, un objectif pourrait être de se divisera1
en tableaux tête et queue en utilisant l'une des deux formes ci-dessus.En utilisant la méthode n ° 1, la valeur de retour deviendrait la tête et
a1
la queue.Maintenant, d'un seul coup, concatène la tête, le corps (
a2
) et la queueAinsi, cette solution ressemble plus au monde réel qu'à toute autre présentée jusqu'à présent. N'est-ce pas ce que vous feriez avec Legos? ;-) Voici une fonction, réalisée en utilisant la méthode # 2.
Plus court:
Plus sûr:
Les avantages de cette solution incluent:
1) Une simple prémisse domine la solution - remplir un tableau vide.
2) La nomenclature de la tête, du corps et de la queue semble naturelle.
3) Pas de double appel à
.slice()
. Aucun tranchage du tout.4) Non
.apply()
. Très inutile.5) Le chaînage des méthodes est évité.
6) Fonctionne dans ECMAScript 3 et 5 simplement en utilisant
var
au lieu delet
ouconst
.** 7) Assure qu'il y aura une tête et une queue à claquer sur le corps, contrairement à de nombreuses autres solutions présentées. Si vous ajoutez un tableau avant ou après les limites, vous devriez au moins utiliser
.concat()
!!!!Remarque: l'utilisation de l'opéateur d'étalement
...
rend tout cela beaucoup plus facile à accomplir.la source
Je voulais trouver un moyen de faire cela avec
splice()
et sans itération: http://jsfiddle.net/jfriend00/W9n27/ .Sous forme de fonction à usage général:
la source
a2
tableau, ce qui n'est probablement pas souhaitable. De plus, vous n’avez pas besoin d’accéder auArray.prototype
lorsque la fonction de tranche est activéea1
oua2
.apply()
méthode.Array.prototype.splice
vsa1.splice
:).concat
renvoie un nouveau tableau, il ne modifie pas l'existant commesplice
. Devrait êtreargs = args.concat(arrayToInsert);
la source
Voici ma version sans astuces spéciales:
la source
.apply()
.Si vous souhaitez insérer un autre tableau dans un tableau sans créer un nouveau, le plus simple est d'utiliser soit
push
ouunshift
avecapply
Par exemple:
Cela fonctionne parce que les deux
push
etunshift
prennent un nombre variable d'arguments. Un bonus, vous pouvez facilement choisir de quelle extrémité attacher le tableau!la source
a1.concat(a2)
oua2.concat(a1)
j'ai conçu quelque chose de plus facile que ce que vous suggérez. Cependant, le problème est l'insertion d'un tableau entre les limites du tableau, pas uniquement l'ajout d'un tableau au début ou à la fin. ;-)Comme mentionné dans un autre fil de discussion, les réponses ci-dessus ne fonctionneront pas dans de très grands tableaux (éléments 200K). Voir la réponse alternative ici impliquant l'épissure et la poussée manuelle: https://stackoverflow.com/a/41465578/1038326
la source