Je recherche une méthode d'insertion de tableau JavaScript, dans le style de:
arr.insert(index, item)
De préférence dans jQuery, mais toute implémentation JavaScript fera l'affaire à ce stade.
javascript
jquery
arrays
tags2k
la source
la source
Réponses:
Ce que vous voulez, c'est la
splice
fonction sur l'objet tableau natif.arr.splice(index, 0, item);
s'inséreraitem
dansarr
l'index spécifié (en supprimant d'0
abord les éléments, c'est-à-dire qu'il s'agit simplement d'un insert).Dans cet exemple, nous allons créer un tableau et y ajouter un élément dans l'index 2:
la source
arr.splice(2,3)
supprimera 3 éléments à partir de l'index 2. Sans passer le 3e .... Nième paramètres rien n'est inséré. Donc, le nominsert()
ne lui rend pas justice non plus.Vous pouvez implémenter la
Array.insert
méthode en procédant comme suit:Ensuite, vous pouvez l'utiliser comme:
la source
Array.prototype.insert = function (index, items) { this.splice.apply(this, [index, 0].concat(items)); }
Autre que l'épissure, vous pouvez utiliser cette approche qui ne mute pas le tableau d'origine, mais crée un nouveau tableau avec l'élément ajouté. Vous devriez généralement éviter la mutation chaque fois que possible. J'utilise l'opérateur de propagation ES6 ici.
Cela peut être utilisé pour ajouter plus d'un élément en ajustant un peu la fonction pour utiliser l'opérateur de repos pour les nouveaux éléments, et le répartir également dans le résultat renvoyé
la source
insert
Méthodes de tableau personnalisées1. Avec plusieurs arguments et un support de chaînage
Il peut insérer plusieurs éléments (comme le
splice
fait le natif ) et prend en charge le chaînage:2. Avec des arguments de type tableau fusionnant et prenant en charge le chaînage
Il peut fusionner des tableaux à partir des arguments avec le tableau donné et prend également en charge le chaînage:
DÉMO: http://jsfiddle.net/UPphH/
la source
["b", "X", "Y", "Z", "c"]
. Pourquoi n'est pas"d"
inclus? Il me semble que si vous mettez 6 comme deuxième paramètre deslice()
et qu'il y a 6 éléments dans le tableau à partir de l'index spécifié, alors vous devriez obtenir les 6 éléments dans la valeur de retour. (Le document dithowMany
pour ce paramètre.) Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(3, 3);
=>[ ]
slice
méthode et nonsplice
, à laquelle vous faites référence dans le commentaire. Le deuxième paramètre deslice
(nomméend
) est l' index de base zéro auquel terminer l'extraction.slice
extrait jusqu'à mais non comprisend
. D'où aprèsinsert
vous avez["a", "b", "X", "Y", "Z", "c", "d"]
, d'oùslice
extrait des éléments avec des indices de1
jusqu'à6
, c'est- à -dire de"b"
à"d"
mais n'incluant pas"d"
. Est-ce que ça fait du sens?Si vous souhaitez insérer plusieurs éléments dans un tableau à la fois, consultez cette réponse Stack Overflow: une meilleure façon de raccorder un tableau en un tableau en javascript
Voici également quelques fonctions pour illustrer les deux exemples:
Enfin, voici un jsFiddle que vous pouvez voir par vous-même: http://jsfiddle.net/luisperezphd/Wc8aS/
Et voici comment vous utilisez les fonctions:
la source
Pour une programmation fonctionnelle et un enchaînement appropriés, une invention de
Array.prototype.insert()
est essentielle. En fait, l'épissage aurait pu être parfait s'il avait renvoyé le tableau muté au lieu d'un tableau vide totalement dénué de sens. Alors voilàEh bien, ce qui précède avec
Array.prototype.splice()
celui mute le tableau d'origine et certains pourraient se plaindre comme "vous ne devriez pas modifier ce qui ne vous appartient pas" et cela pourrait aussi être correct. Donc, pour le bien-être public, je voudrais en donner un autreArray.prototype.insert()
qui ne mute pas le tableau d'origine. Ça y va;la source
splice
mute le tableau d'origine, je ne pense pas qu'une "programmation fonctionnelle appropriée" appartienne à quelque part à proximité desplice
.Je recommande d'utiliser du JavaScript pur dans ce cas, il n'y a pas non plus de méthode d'insertion en JavaScript, mais nous avons une méthode qui est une méthode Array intégrée qui fait le travail pour vous, elle s'appelle splice ...
Voyons ce qui est splice () ...
OK, imaginez que nous avons ce tableau ci-dessous:
Nous pouvons supprimer
3
comme ceci:Il retournera 3, mais si nous vérifions l'arr maintenant, nous avons:
Jusqu'à présent, tout va bien, mais comment pouvons-nous ajouter un nouvel élément au tableau en utilisant une épissure? Remettons 3 à l'arr ...
Voyons voir ce que nous avons fait ...
Nous utilisons à nouveau l' épissure , mais cette fois pour le deuxième argument, nous passons 0 , cela signifie que nous ne voulons supprimer aucun élément, mais en même temps, nous ajoutons un troisième argument qui est 3 qui sera ajouté au deuxième index ...
Vous devez savoir que nous pouvons supprimer et ajouter en même temps, par exemple maintenant nous pouvons faire:
Ce qui supprimera 2 éléments à l'index 2, puis en ajoutera 3 à l'index 2 et le résultat sera:
Cela montre comment fonctionne chaque élément de l'épissure:
la source
Ajouter un élément unique à un index spécifique
Ajouter plusieurs éléments à un index spécifique
la source
arrName[3] = 'newName1';
s'ajoutera si le tableau n'a que 3 éléments. S'il y a un élément dans l'index 3, il sera remplacé. Si vous souhaitez ajouter à la fin, il est préférable d'utiliserarrName.push('newName1');
Une autre solution possible, avec l'utilisation de
Array#reduce
.la source
Voici deux façons:
OU
la source
Même si cela a déjà été répondu, j'ajoute cette note pour une approche alternative.
Je voulais placer un nombre connu d'éléments dans un tableau, dans des positions spécifiques, car ils sortent d'un "tableau associatif" (c'est-à-dire un objet) qui, par définition, n'est pas garanti d'être dans un ordre trié. Je voulais que le tableau résultant soit un tableau d'objets, mais les objets soient dans un ordre spécifique dans le tableau car un tableau garantit leur ordre. J'ai donc fait ça.
D'abord l'objet source, une chaîne JSONB récupérée de PostgreSQL. Je voulais le faire trier par la propriété "order" dans chaque objet enfant.
Puisque le nombre de nœuds dans l'objet est connu, je crée d'abord un tableau avec la longueur spécifiée:
Et puis itérer l'objet, en plaçant les objets temporaires nouvellement créés dans les emplacements souhaités dans le tableau sans vraiment "tri".
la source
Quiconque a toujours des problèmes avec celui-ci et a essayé toutes les options ci-dessus et ne l'a jamais obtenu. Je partage ma solution, c'est pour prendre en considération que vous ne voulez pas énoncer explicitement les propriétés de votre objet par rapport au tableau.
Il s'agit d'une combinaison de l'itération du tableau de référence et de sa comparaison avec l'objet que vous souhaitez vérifier, convertissez-les tous les deux en une chaîne, puis répétez-les s'ils correspondent. Ensuite, vous pouvez simplement compter. Cela peut être amélioré mais c'est là que je me suis installé. J'espère que cela t'aides.
la source
Profitant de la méthode de réduction comme suit:
Donc, de cette façon, nous pouvons retourner un nouveau tableau (ce sera une façon fonctionnelle cool - bien mieux que d'utiliser push ou splice) avec l'élément inséré à l'index, et si l'index est supérieur à la longueur du tableau, il sera inséré à la fin.
la source
Array#splice()
est la voie à suivre, sauf si vous voulez vraiment éviter de muter le tableau. Étant donné 2 tableauxarr1
etarr2
, voici comment insérer le contenu dearr2
dansarr1
après le premier élément:Si vous êtes préoccupé par la mutation du tableau (par exemple, si vous utilisez Immutable.js), vous pouvez utiliser à la place
slice()
, à ne pas confondresplice()
avec a'p'
.la source
J'ai essayé ça et ça marche bien!
L'index est la position où vous souhaitez insérer ou supprimer l'élément. 0, c'est-à-dire que le deuxième paramètre définit le nombre d'éléments de l'index à supprimer. Ce sont les nouvelles entrées que vous voulez faire dans le tableau. Il peut en être un ou plusieurs.
la source
Voici une fonction de travail que j'utilise dans l'une de mes applications.
Ceci vérifie si la sortie de l'article
Et puis je l'appelle ci-dessous.
la source
Un peu d'un fil plus ancien, mais je dois être d'accord avec Redu ci-dessus car l'épissure a définitivement une interface confuse. Et la réponse donnée par cdbajorin selon laquelle "il ne renvoie un tableau vide que lorsque le deuxième paramètre est 0. S'il est supérieur à 0, il renvoie les éléments supprimés du tableau" est, bien que précise, prouvant le point. L'intention de la fonction est de raccorder ou, comme dit précédemment par Jakob Keller, "de se joindre ou de se connecter, également de changer. Vous avez un tableau établi que vous modifiez maintenant, ce qui impliquerait l'ajout ou la suppression d'éléments ...." Étant donné que, le la valeur de retour des éléments, le cas échéant, qui ont été supprimés est, au mieux, maladroite. Et je suis à 100% d'accord pour dire que cette méthode aurait pu être mieux adaptée au chaînage si elle avait renvoyé ce qui semble naturel, un nouveau tableau avec les éléments épissés ajoutés. Ensuite, vous pouvez faire des choses comme ["19", "17"]. Splice (1,0, "18"). Join ("...") ou tout ce que vous voulez avec le tableau renvoyé. Le fait qu'il retourne ce qui a été supprimé est juste un peu absurde à mon humble avis. Si l'intention de la méthode était de "découper un ensemble d'éléments" et que c'était seulement son intention, peut-être. Il semble que si je ne sais pas déjà ce que je coupe, j'ai probablement peu de raisons de couper ces éléments, n'est-ce pas? Il serait préférable qu'il se comporte comme concat, map, réduire, tranche, etc. où un nouveau tableau est fait à partir du tableau existant plutôt que de muter le tableau existant. Ce sont tous chaînables, et c'est un problème important. Il est plutôt courant de manipuler des tableaux en chaîne. On dirait que la langue doit aller dans l'une ou l'autre direction et essayer de s'y tenir le plus possible. Javascript étant fonctionnel et moins déclaratif, il semble juste être un étrange écart par rapport à la norme.
la source
Performance
Aujourd'hui (2020.04.24), j'effectue des tests pour les solutions choisies pour les petites et grandes baies. Je les ai testés sur MacOs High Sierra 10.13.6 sur Chrome 81.0, Safari 13.1, Firefox 75.0.
Conclusions
Pour tous les navigateurs
slice
etreduce
(D, E, F) sont généralement 10x à 100x plus rapides que les solutions en placesplice
(AI, BI, CI) étaient les plus rapides (parfois ~ 100x - mais cela dépend de la taille du tableau)Détails
Les tests ont été divisés en deux groupes: solutions sur place (AI, BI, CI) et solutions non sur place (D, E, F) et ont été effectués pour deux cas
Le code testé est présenté dans l'extrait ci-dessous
Afficher l'extrait de code
Des exemples de résultats pour un petit tableau sur du chrome sont ci-dessous
la source