Quelle est la différence entre l'utilisation de l' delete
opérateur sur l'élément de tableau et l'utilisation de la Array.splice
méthode ?
Par exemple:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
Pourquoi même avoir la méthode d'épissage si je peux supprimer des éléments de tableau comme je le peux avec des objets?
javascript
arrays
array-splice
delete-operator
lYriCAlsSH
la source
la source
.splice
boucles in, jetez un œil à cette question: Supprimer du tableau en javascript .delete
etArray.prototype.splice
.Réponses:
delete
supprimera la propriété de l'objet, mais ne réindexera pas le tableau ni ne mettra à jour sa longueur. Cela donne l'impression qu'il n'est pas défini:Notez qu'il est en fait pas ensemble à la valeur
undefined
plutôt la propriété est retirée du tableau, ce qui en fait apparaître non défini. Les outils de développement Chrome rendent cette distinction claire en imprimantempty
lors de la journalisation de la baie.myArray.splice(start, deleteCount)
supprime réellement l'élément, réindexe le tableau et modifie sa longueur.la source
delete
ne retirez l'élément, mais ne réindexer pas le tableau ou mettre à jour sa longueur (qui est sous - entendu par l'ancien puisque la longueur est toujours le plus haut indice + 1).delete myArray[0]
syntaxe disant " Attendu un opérateur et vu à la place" supprimer ". " L'utilisationsplice
est recommandée.delete myArray[0]
etmyArray[0] = undefined
. Dans le premier cas, la propriété est entièrement supprimée de l'objet tableau. Dans le second cas, la propriété reste, avec la valeurundefined
.empty
au lieu d'undefined
améliorer la distinction entre un élément de tableau réellement supprimé (ou non initialisé) et un élément qui a la valeur réelle deundefined
. Notez que lorsque je dis cela, je veux dire qu'il s'affiche uniquement sous la formeempty
et ne fait pas référence à une valeur réelle appeléeempty
(qui n'existe pas).Array.remove (), méthode
John Resig , créateur de jQuery a créé une
Array.remove
méthode très pratique que je l'utilise toujours dans mes projets.et voici quelques exemples de la façon dont il pourrait être utilisé:
Site Web de John
la source
[1,2,3].slice('1'); // =[2,3]
), il est donc plus sûr de le changer envar rest = this.slice(parseInt(to || from) + 1 || this.length);
this.push.apply(this, rest)
, puis renvoie la valeur qu'elle a renvoyéefor(var i in array)
cycle. Je l'ai supprimé et j'ai utilisé l'épissure à la place.Étant donné que la suppression supprime uniquement l'objet de l'élément du tableau, la longueur du tableau ne changera pas. Splice supprime l'objet et raccourcit le tableau.
Le code suivant affichera "a", "b", "non défini", "d"
Alors que cela affichera "a", "b", "d"
la source
myArray.splice(2,1)
Je suis tombé sur cette question en essayant de comprendre comment supprimer chaque occurrence d'un élément d'un tableau. Voici une comparaison de
splice
etdelete
pour supprimer tous les éléments'c'
duitems
tableau.la source
De Core JavaScript 1.5 Reference> Operators> Special Operators> delete Operator :
la source
splice
fonctionnera avec des indices numériques.alors qu'il
delete
peut être utilisé contre d'autres types d'indices.exemple:
la source
Il convient également de mentionner que l'épissure ne fonctionne que sur les tableaux. (Les propriétés des objets ne peuvent pas être utilisées pour suivre un ordre cohérent.)
Pour supprimer la paire clé-valeur d'un objet, supprimer est en fait ce que vous voulez:
la source
supprimer l'épissure Vs
lorsque vous supprimez un élément d'un tableau
quand vous épissez
en cas de suppression l' élément est supprimé mais le index reste vide
tandis qu'en cas d' épissage, l' élément est supprimé et l' indice des éléments de repos est réduit en conséquence
la source
Comme indiqué à plusieurs reprises ci-dessus, l'utilisation
splice()
semble être un ajustement parfait. Documentation chez Mozilla:la source
delete agit comme une situation non réelle, il supprime simplement l'élément, mais la longueur du tableau reste la même:
exemple du terminal de noeud:
Voici une fonction pour supprimer un élément d'un tableau par index, en utilisant slice () , il prend l'arr comme premier argument et l'index du membre que vous voulez supprimer comme deuxième argument. Comme vous pouvez le voir, il supprime en fait le membre du tableau et réduira la longueur du tableau de 1
Ce que fait la fonction ci-dessus, c'est de prendre tous les membres jusqu'à l'index et tous les membres après l'index, de les concaténer ensemble et de retourner le résultat.
Voici un exemple utilisant la fonction ci-dessus comme module de nœud, voir le terminal sera utile:
veuillez noter que cela ne fonctionnera pas avec un seul tableau contenant des dupes, car indexOf ("c") obtiendra simplement la première occurrence, et ne fera qu'épisser et supprimer le premier "c" qu'il trouve.
la source
Si vous souhaitez parcourir un grand tableau et supprimer des éléments de manière sélective, il serait coûteux d'appeler splice () pour chaque suppression car splice () devrait réindexer les éléments suivants à chaque fois. Étant donné que les tableaux sont associatifs en Javascript, il serait plus efficace de supprimer les éléments individuels, puis de réindexer le tableau par la suite.
Vous pouvez le faire en créant un nouveau tableau. par exemple
Mais je ne pense pas que vous puissiez modifier les valeurs de clé dans le tableau d'origine, ce qui serait plus efficace - il semblerait que vous deviez créer un nouveau tableau.
Notez que vous n'avez pas besoin de vérifier les entrées "non définies" car elles n'existent pas réellement et la boucle for ne les renvoie pas. C'est un artefact de l'impression en réseau qui les affiche comme indéfinis. Ils ne semblent pas exister dans la mémoire.
Ce serait bien si vous pouviez utiliser quelque chose comme slice () qui serait plus rapide, mais il ne se réindexerait pas. Quelqu'un connaît une meilleure façon?
En fait, vous pouvez probablement le faire en place comme suit, ce qui est probablement plus efficace, en termes de performances:
la source
vous pouvez utiliser quelque chose comme ça
la source
slice
si vous venez d'un milieu fonctionnel (probablement moins efficace, cependant).Pourquoi ne pas simplement filtrer? Je pense que c'est la façon la plus claire de considérer les tableaux en js.
la source
delete
ouslice
.La différence peut être vue en enregistrant la longueur de chaque tableau après l'application de l'
delete
opérateur et de lasplice()
méthode. Par exemple:supprimer l'opérateur
L'
delete
opérateur supprime l'élément du tableau, mais l '"espace réservé" de l'élément existe toujours.oak
a été supprimé mais il prend toujours de la place dans le tableau. Pour cette raison, la longueur du tableau reste 5.méthode splice ()
La
splice()
méthode supprime complètement la valeur cible et "l'espace réservé" également.oak
a été supprimé ainsi que l'espace qu'il occupait auparavant dans le tableau. La longueur du tableau est désormais de 4.la source
exemple:
la banane est supprimée et la longueur du tableau = 2
la source
Ce sont des choses différentes qui ont des objectifs différents.
splice
est spécifique au tableau et, lorsqu'il est utilisé pour la suppression, supprime les entrées du tableau et déplace toutes les entrées précédentes vers le haut pour combler l'écart. (Il peut également être utilisé pour insérer des entrées, ou les deux en même temps.)splice
Changeralength
le tableau (en supposant que ce n'est pas un appel sans opération:)theArray.splice(x, 0)
.delete
n'est pas spécifique à un tableau; il est conçu pour être utilisé sur des objets: il supprime une propriété (paire clé / valeur) de l'objet sur lequel vous l'utilisez. Cela ne s'applique qu'aux tableaux car les tableaux standard (par exemple, non typés) en JavaScript ne sont pas du tout des tableaux *, ce sont des objets avec une gestion spéciale pour certaines propriétés, comme ceux dont les noms sont des "index de tableau" (qui sont définis comme des noms de chaîne "... dont la valeur numériquei
est dans la plage+0 ≤ i < 2^32-1
") etlength
. Lorsque vous utilisezdelete
pour supprimer une entrée de tableau, il ne fait que supprimer l'entrée; il ne déplace pas les autres entrées qui le suivent pour combler l'écart, et donc le tableau devient "clairsemé" (certaines entrées sont complètement manquantes). Cela n'a aucun effet surlength
.Quelques-unes des réponses actuelles à cette question indiquent à tort que l'utilisation de
delete
"définit l'entréeundefined
". Ce n'est pas correct. Il supprime entièrement l'entrée (propriété), laissant un espace.Utilisons du code pour illustrer les différences:
* (c'est un article sur mon petit blog anémique)
la source
Actuellement, il existe deux façons de procéder
en utilisant splice ()
arrayObject.splice(index, 1);
en utilisant supprimer
delete arrayObject[index];
Mais je suggère toujours d'utiliser l'épissure pour les objets de tableau et de supprimer pour les attributs d'objet car la suppression ne met pas à jour la longueur du tableau.
la source
OK, imaginez que nous avons ce tableau ci-dessous:
Supprimons d'abord:
et voici le résultat:
vide!et allons-y:
Cela signifie donc juste la valeur supprimée et c'est pas définie maintenant, donc la longueur est la même, elle reviendra également vraie ...
Réinitialisons notre tableau et faisons-le avec une épissure cette fois:
et voici le résultat cette fois:
Comme vous le voyez, la longueur du tableau a changé et
arr[1]
est désormais de 3 ...Cela retournera également l'élément supprimé dans un tableau qui est
[3]
dans ce cas ...la source
D'autres ont déjà correctement comparé
delete
avecsplice
.Une autre comparaison intéressante est
delete
par rapport àundefined
: un élément de tableau supprimé utilise moins de mémoire que celui qui vient d'être défini surundefined
;Par exemple, ce code ne se terminera pas:
Il produit cette erreur:
Donc, comme vous pouvez le voir, cela
undefined
prend en fait de la mémoire.Cependant, si vous avez également
delete
l'élément ary (au lieu de le définir uniquementundefined
), le code se terminera lentement:Ce sont des exemples extrêmes, mais ils soulignent
delete
que je n'ai vu personne mentionner nulle part.la source
Si vous avez un petit tableau, vous pouvez utiliser
filter
:la source
Le moyen le plus simple est probablement
J'espère que cela t'aides. Référence: https://lodash.com/docs#compact
la source
compact
... pas besoin de lodash. EssayezmyArray.filter(function(n){return n;})
Pour ceux qui veulent utiliser Lodash peuvent utiliser:
myArray = _.without(myArray, itemToRemove)
Ou comme j'utilise dans Angular2
la source
Supprimer l'élément du dernier
Supprimer l'élément du premier
Supprimer du milieu
Supprimer un élément du dernier
Supprimer en utilisant le numéro d'index du tableau
la source
Si l'élément à supprimer se trouve au milieu (disons que nous voulons supprimer «c», dont son index est 1), vous pouvez utiliser:
la source
IndexOf
accepte également un type de référence. Supposons le scénario suivant:Différemment:
la source
// résultat: myArray = ['b', 'c', 'd'];
la source