Comment puis-je supprimer une propriété d'un objet JavaScript?
Dire que je créer un objet comme suit:
var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Quelle est la meilleure façon d'enlever la propriété regex
à la fin avec de nouvelles myObject
comme suit?
var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
- Trouvez ici un point de repère qui compare "supprimer" vs "undefined" vs "null" jsben.ch/#/BWMiw
- developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Vous devez vous connecter pour publier un commentaire.
Comme ceci:
Démo
JS:
Pour toute personne intéressée à en savoir plus à ce sujet, de Débordement de Pile utilisateur kangax a écrit un incroyablement approfondie billet de blog sur le
delete
déclaration sur leur blog, La compréhension de supprimer. Il est fortement recommandé.var x = {a : 'A', b : 'B'};
Comparer:delete x.a; typeof x.a; /* "undefined" */ x.hasOwnProperty('a'); /* false */
àx.b = undefined; typeof x.b; /* "undefined" */; x.hasOwnProperty('b'); /* true */
for(var k in obj) { delete obj[k]; }
va annuler toutes les propriétés de l'objet (non pas que tu avais déjà l'usage de ce, spécifiquement -- mais vous pouvez ajouter une condition, commeif (obj[k] === 2)
).delete
expression:var x = 'x'; delete object[x];
.isEmptyObject
la fonction retournera false..splice()
delete
interdit lors de l'utilisation de JS mode Strict? doc sur le mode strict. Comment pourrais-je supprimer la propriété lors de l'utilisation en mode strict?delete
fonctionne, je peux vous recommandons la lecture de sa fonction équivalente,Reflect.deleteProperty
- à la fois effectuer exactement la même opération, mais la fonction peut-être un peu plus compréhensible.Opérateur
delete
est lent de façon inattendue!Regarder la référence.
Supprimer est le seul vrai moyen de supprimer les propriétés de l'objet, sans restes, mais il fonctionne ~ 100 fois plus lent,
par rapport à son "alternative", la mise en
object[key] = undefined
.Cette solution n'est pas la bonne réponse à cette question! Mais, si vous l'utilisez avec soin, vous pouvez accélérer considérablement certains algorithmes. Si vous utilisez
delete
en boucle et vous avez des problèmes avec la performance, de lire l'explication détaillé.Quand doit-on utiliser
delete
et lorsque la valeur définie pourundefined
?Un objet peut être vu comme un ensemble de paires clé-valeur. Ce que j'appelle une "valeur" est une primitive ou une référence à un autre objet, connecté à la "clé".
Utilisation
delete
, lorsque vous êtes de passage de l'objet de résultat pour le code sur lequel vous n'avez pas le contrôle (ou lorsque vous n'êtes pas sûr de votre équipe ou vous-même).Il supprime la clé de la table de hachage.
Utilisez le réglage de
undefined
, quand vous vous souciez de la performance. Il peut donner un sérieux coup de pouce à votre code.La clé reste sur sa place dans la table de hachage, seule la valeur est remplacée par
undefined
. Comprendre, quefor..in
boucle sera toujours effectuer une itération sur cette touche.À l'aide de cette méthode, et non tous les des moyens de détermination de l'existence de la propriété fonctionnera comme prévu.
Toutefois, ce code:
object.field === undefined
va se comporter de manière équivalente pour les deux méthodes.
Tests
Pour résumer, les différences sont toutes des façons de déterminer l'existence de la propriété, et sur
for..in
boucle.Méfiez-Vous Des Fuites De Mémoire!
Tout en utilisant
obj[prop] = undefined
est plus rapide que de le fairedelete obj[prop]
, une autre considération importante est queobj[prop] = undefined
ne sont pas toujours appropriées.delete obj[prop]
supprimeprop
deobj
et efface de la mémoire alors queobj[prop] = undefined
suffit simplement de définir la valeur deprop
àundefined
qui laisseprop
encore en mémoire. Par conséquent, dans le cas où il y a beaucoup de touches d'être créés et supprimés, à l'aide deobj[prop] = undefined
pouvez forcer cher la mémoire de la réconciliation (causant la page de gel) et potentiellement une erreur de mémoire. Examinez le code suivant.Dans le code ci-dessus, il suffit de faire
nodeRecords[i][lastTime] = undefined;
sera la cause d'une énorme fuite de mémoire parce que chaque image d'animation. Chaque cadre, tous les 65536 des éléments du DOM va prendre un autre 65536 emplacements individuels, mais le précédent 65536 machines à sous vont seulement être indéfinie qui laisse pendre dans la mémoire. Allez-y, essayez d'exécuter le code ci-dessus dans la console et voir par vous-même. Après avoir forcé une erreur de mémoire, essayez de l'exécuter à nouveau, sauf avec la version suivante du code qui utilise ladelete
opérateur à la place.Comme on le voit dans l'extrait de code ci-dessus, il existe quelques rares appropriées en cas d'utilisation pour le
delete
de l'opérateur. Cependant, ne vous inquiétez pas à propos de ce problème de trop. Cela ne devienne un problème avec longue durée de vie des objets d'obtenir de nouvelles clés constamment ajoutés. Dans les autres cas (ce qui est presque tous les cas dans le monde réel, programmation), il est plus approprié d'utiliserobj[prop] = undefined
. Le but principal de cette section est juste de porter cette question à votre attention afin que, dans les rares chances pour que cela ne devient un problème dans votre code, vous pouvez plus facilement comprendre le problème et de ne plus avoir à perdre des heures à disséquer votre code de localiser et de comprendre ce problème.Ne Sont Pas Toujours Mis À
undefined
Un aspect de Javascript qui est important à considérer est le polymorphisme. Le polymorphisme est lors de l'attribution de la même variable/fente-dans-un-objet de différents types comme vu ci-dessous.
Cependant, il existe deux grands irrécupérable problèmes avec les tableaux polymorphes:
On peut comparer le polymorphisme pour un problème de toxicomanie. À première vue, il semble incroyablement lucrative: très jolis moelleux code. Ensuite, le codeur présente son tableau à la drogue de polymorphisme. Instantanément, le polymorphe tableau devient de moins en moins efficace, et il ne peut jamais devenir aussi efficace qu'il l'était avant, car il est drogué. Une corrélation, une telle circonstance de la vie réelle, quelqu'un de la cocaïne pourrait même ne pas être capable de l'exploitation d'une simple poignée de porte, encore moins être en mesure de calculer les décimales de PI. De même, un tableau sur le médicament de polymorphisme ne peut jamais être aussi efficace qu'un monomorphe tableau.
Mais, comment un médicament analogie voyage se rapportent à la
delete
opération? La réponse est inhérent à la dernière ligne de code dans l'extrait ci-dessus. Donc permettez d'être réexaminés, cette fois avec une torsion.Observer.
bar[1] = ""
ne pas contraindre le polymorphisme alors quebar[1] = undefined
n'. Par conséquent, on devrait toujours, chaque fois que possible, utiliser le type correspondant pour leurs objets, afin de ne pas accidentellement provoquer le polymorphisme. Une telle personne peut utiliser la liste suivante comme une référence générale pour les faire aller. Cependant, veuillez ne pas utiliser explicitement la ci-dessous des idées. Au lieu de cela, utiliser ce qui fonctionne bien pour votre code.false
ouundefined
que la valeur vide. Tout en évitant les polymorphisme est bonne, la réécriture de tous vos codes d'interdire explicitement, il ne sera probablement entraîner une diminution des performances. Utilisez votre bon jugement!0
que la valeur vide. Notez que, en interne, il y a deux types de nombres: rapide entiers (2147483647 de -2147483648 inclus) et lent à virgule flottante en double (autre chose que cela, y comprisNaN
etInfinity
). Quand un nombre entier est rétrogradé à une double, il ne peut pas être promus à un entier.""
que la valeur vide.null
.Cependant, être conscient! Ne pas soudainement commencer à faire cela avec tous vos préexistante code maintenant qu'elle irait à l'encontre de ces derniers code et/ou d'introduire des bugs étranges. Plutôt, une pratique efficiente doit être mis en œuvre dès le début, et lors de la conversion de code préexistant, il est recommandé que vous double, triple, quadruple vérifier toutes les lignes relatives à cette tentative de mise à niveau de l'ancien code de cette nouvelle pratique peut être aussi risqué que c'est gratifiant.
delete
d'elle.delete
est encore 98% plus lent que les autres "alternatives" dans votre JSPerf test. Cependant, lorsqu'on compare des choses, on doit utiliser le les mêmes normes dans tous les cas. Il va sans dire que la suppression d'une propriété, indépendamment de si c'est fait à l'aide dedelete
ou toute autre fonction, sera toujours être plus lent que l'affectation d'une valeur à cette propriété, même 100 ans à partir de maintenant. Tout comme la suppression d'un bouton à partir d'une page web sera toujours plus lent que la peinture dans une couleur transparente - elles sont différentes opérations, alias " différentes normes utilisées pour la comparaison...undefined
ne serait pas en fait de supprimer la propriété, par conséquent, ne répond pas à la questionJS:
Cela fonctionne dans Firefox et Internet Explorer, et je pense que cela fonctionne dans tous les autres.
Mise à jour 2018-07-21: Pendant un long moment, j'ai senti gêné à propos de cette réponse, donc je pense qu'il est temps que je le touche un peu. Juste un petit commentaire, de clarification et de mise en forme pour aider à accélérer la lecture de la inutilement long et alambiqué parties de cette réponse.
LA VERSION COURTE
La réponse exacte à la question
Comme d'autres l'ont dit, vous pouvez utiliser
delete
.Tableau équivalent
Ne pas
delete
à partir d'un tableau. UtilisationArray.prototype.splice
à la place.LA VERSION LONGUE
JavaScript est un Langage de programmation orientée objet, donc tout est un objet, y compris tableaux. Donc, je pense qu'il faut une mise en garde.
Dans des tableaux, à la différence de la plaine de vieux objets, à l'aide
delete
laisse derrière lui des ordures dans la forme denull
, la création d'un "trou" dans le tableau.Comme vous pouvez le voir,
delete
ne fonctionnent pas toujours comme on pourrait s'y attendre. La valeur est écrasée, mais la mémoire n'est pas réaffecté. C'est-à-dire,array[4]
n'est pas relocalisé àarray[3]
. Ce qui est en contraste àArray.prototype.unshift
, qui insère un élément au début du tableau et décale tout vers le haut (array[0]
devientarray[1]
, etc.)Honnêtement, outre la définition de
null
plutôt queundefined
--qui est légitimement bizarre--ce comportement ne devrait pas être surprenant, étant donné quedelete
est un opérateur unaire, commetypeof
, c'est-durs dans la langue et n'est pas censé se soucient de la type de l'objet, il est utilisé, alors queArray
est une sous-classe deObject
avec des méthodes spécialement conçu pour travailler avec des tableaux. Donc il n'y a aucune bonne raison pourdelete
d'avoir un cas spécial cuit dans de re-déplacer le tableau, car cela ne ferait que ralentir les choses avec le travail inutile. Rétrospectivement, mes attentes étaient irréalistes.Bien sûr, il ne une surprise pour moi. Parce que j'ai écrit cela pour justifier ma croisade contre les "null ordures":
Qui est un terrible justification pour se débarrasser de la
null
s--null
est seulement dangereux si mal utilisé, et il n'a rien à voir avec "précision". La vraie raison pour laquelle vous ne devriez pasdelete
à partir d'un tableau est de laisser des ordures remplis et désordonné des structures de données autour de est bâclée et bug sur le ventre.Ce qui suit est artificiel, scénario qui obtient assez de longue haleine, de sorte que vous pouvez passer à la section La Solution, si vous le souhaitez. La seule raison pour laquelle je quitte cette section c'est que je pense que certaines personnes pensent probablement que c'est drôle, et je ne veux pas être "ce mec" qui publie un "drôle" de répondre, puis supprime tous les "drôle" de cela plus tard.
...C'est stupide, je sais.
L'artificiel et de longue haleine PDP-11 scénario
La Solution:
Array.prototype.splice
Heureusement, les tableaux ne ont une méthode spécialisée pour la suppression d'indices et de réaffectation de mémoire:
Array.prototype.splice()
. Vous pouvez écrire quelque chose comme ceci:Et juste comme ça, vous êtes heureux que M. PDP-11. Hourra! (j'aurais quand même le lui dire, mais...)
Tableau.le prototype.splice vs Tableau.le prototype.tranche
Je pense qu'il est important de souligner la différence entre ces deux même nom de fonctions, comme ils sont à la fois très utile.
Tableau.le prototype.splice(démarrer, n)
.splice()
se transforme le tableau, et renvoie l'retirée des indices. Le tableau est coupé à partir de l'index,start
, etn
éléments sont découpées. Si n n'est pas spécifié, l'ensemble de la matrice aprèsstart
est découpées (n = array.length - start
).Tableau.le prototype.tranche(début, fin)
.slice()
est non destructif et renvoie un nouveau tableau contenant l'indication des indices destart
àend
. Siend
n'est spécifié, le comportement est le même que.splice()
(end = array.length
). Le comportement est un peu délicate, car, pour une raison quelconque,end
index à partir de 1 au lieu de 0. Je ne sais pas pourquoi il fait cela, mais c'est comment il est. Aussi, siend <= start
, le résultat est un tableau vide.Ce n'est pas vraiment ce qui se passe, mais il est plus facile de penser de cette façon. Selon le MDN, voici ce qui se passe vraiment:
L'index spécifié par
end
est tout simplement exclus de la tranche. La mise entre parenthèses des indices indiquent ce qui est tranché. De toute façon, le comportement n'est pas intuitif, et il est lié à provoquer sa juste part de tout-en-un d'erreurs, de sorte que vous pourriez trouver utile de faire une fonction wrapper de plus près à émuler le comportement de.splice()
:Noter que la fonction wrapper est conçu pour être très strict sur les types, et sera de retour
null
si quelque chose est éteint. Qui comprend la mise en une chaîne de caractères comme"3"
. Il est laissé au programmeur de faire preuve de diligence au sujet de ses types. C'est pour encourager les bonnes de la programmation de la pratique.Mise à jour concernant
is_array()
C'est en ce qui concerne ce (maintenant supprimé) extrait de:
Donc comme il s'avère, il ya effectivement un moyen intégré pour savoir si un tableau est vraiment un tableau, et c'est
Array.isArray()
, introduit dans ECMAScript 5 (décembre 2009). J'ai trouvé cela tout à la recherche pour voir si il y avait une question à poser au sujet de raconter des tableaux à partir d'objets, pour voir si il y avait une meilleure solution que la mienne, ou pour ajouter le mien si il n'y en avait aucune. Donc, si vous utilisez une version de JavaScript qui est antérieure à l'ECMA 5, il y a votre polyfill. Toutefois, je recommande fortement contre l'utilisation de monis_array()
fonction, en tant que de continuer à supporter les anciennes versions de JavaScript, c'est continuer à soutenir les anciens navigateurs qui les mettent en œuvre, ce qui signifie encourager l'utilisation des logiciels vulnérables et de mettre les utilisateurs à risque pour les logiciels malveillants. Donc, s'il vous plaît, utilisezArray.isArray()
. Utilisationlet
etconst
. Utiliser les nouvelles fonctionnalités sont ajoutées à la langue. Ne pas utiliser des fournisseurs de préfixes. Supprimer que IE polyfill de la merde de votre site web. Supprimer XHTML<!CDATA[[...
de la merde, trop--nous avons déménagé à HTML5 de retour en 2014. Le plus tôt que tout le monde se retire soutien pour ces vieux/ésotérique navigateurs, le plus tôt sera le navigateur vendeurs suivent le standard du web et utiliser la nouvelle technologie, et le plus tôt nous pouvons passer à un plus web sécurisé.delete
mot-clé, cependant, est beaucoup plus pratique, loldelete
et de faire une Collecte des Ordures fonction de la nettoyer.delete array[index]
, et j'ai dû écrire ma propre méthode de collecte des ordures à maintenir le réseau propre de sorte qu'il ne serait pas encombrer le localStorage/passer un certain nombre.Array.prototype.splice()
. J'ai donné ma réponse une mise à jour indispensablesplice
dans votre montage, maisremove
devrait êtreArray.prototype.remove = function(index) { this.splice(index, 1); };
splice()
.array.splice(index, 1)
....Array.prototype.remove()
prend sans doute bien plus que les quelque 8 octets nécessaires à la définition de ces deux entiers.array.splice()
au lieu de cela, qu'correctement les contrôles de la matrice.Array.prototype.remove
delete
sera la meilleure réponse à cette question.Vieille question, réponse moderne. À l'aide de l'objet de déstructuration, un ECMAScript 6 fonctionnalité, c'est aussi simple que:
Ou avec les questions de l'échantillon:
Vous pouvez le voir en action dans la Babel d'essai de l'éditeur.
Edit:
De réaffecter à la même variable, utiliser un
let
:regex
vous pourriez aussi l'attribuer à une autre variable, par exemple_
, ce qui est en usage dans les langues, comme Aller jeter un résultat:const { regex: _, ...newObject } = myObject;
.--harmony
: node.vert/...const { [key], ...newObject } = myObject;
mais ça ne marche pas, donc je ne pense pas que c'est possible avec la déstructuration.freeze()
'd etseal()
'd objets, vous ne pouvez pas simplementdelete
une propriété. C'est donc une excellente alternative. Bien que dans la plupart des cas, il ne sera probablement pas de sens pour supprimer une propriété à partir d'un surgelés/scellé objet de toute façon, vu que le but est d'apporter certaines garanties quant à vos structures de données, de ce modèle serait porter atteinte. Pour les cas où vous avez besoin de manière non destructive la dupe d'un objet, mais sans certaines de ses propriétés, c'est parfaitUne autre alternative est d'utiliser la Underscore.js de la bibliothèque.
Noter que
_.pick()
et_.omit()
à la fois de renvoyer une copie de l'objet, et ne pas modifier directement l'objet d'origine. L'affectation du résultat de l'objet d'origine devrait faire l'affaire (non illustré).Référence: lien _.pick(objet, *les touches)
De renvoyer une copie de l'objet, filtrée uniquement de valeurs pour l'
dans la liste blanche des touches (ou un tableau de clés valides).
Référence: lien _.omettre(objet, *les touches)
De renvoyer une copie de l'objet, filtrée à omettre la
sur la liste noire des clés (ou d'une matrice de touches).
Pour les tableaux,
_.filter()
et_.reject()
peut être utilisée de manière similaire._.omit(collection, key.toString())
delete obj[prop]
qui est de ~100 fois plus lent queobj[prop] = undefined
.La Propagation De La Syntaxe (ES6)
À celui qui en a besoin...
Pour compléter le @Koen réponse dans ce fil, dans le cas où vous souhaitez supprimer une variable dynamique à l'aide de la propagation de la syntaxe, vous pouvez le faire comme ceci:
*
foo
sera une nouvelle variable avec la valeur dea
(qui est 1).Mise à JOUR:
Il existe quelques moyens pour supprimer une propriété d'un objet.
Chacun a ses propres avantages et inconvénients (cochez cette comparaison des performances):
Opérateur Delete
Lisible et court, cependant, il pourrait ne pas être le meilleur choix si vous êtes sur un grand nombre d'objets que sa performance n'est pas optimisé.
Réaffectation
Plus de 2X plus rapide que
delete
, cependant, la propriété est pas supprimé et ne peut être réitéré.la Propagation de l'Opérateur
Cette
ES6
opérateur nous permet de revenir une nouvelle marque de l'objet, à l'exclusion de toutes les propriétés, sans la mutation de l'objet existant. L'inconvénient est qu'il a la pire performance de la ci-dessus et n'est pas adapté pour être utilisé lorsque vous avez besoin de supprimer de nombreuses propriétés à la fois.Le terme que vous avez utilisé dans votre question titre
Remove a property from a JavaScript object
, peut être interprété de différentes façons. L'un est à retirer pour l'ensemble de la mémoire et de la liste des clés de l'objet ou de l'autre, c'est juste pour le supprimer de votre objet. Comme il a été mentionné dans d'autres réponses, ledelete
mot-clé est la partie principale. Disons que vous avez votre objet comme:Si vous n':
le résultat serait:
Vous pouvez supprimer cette touche spécifique de vos clés de l'objet comme:
Ensuite votre clé objets à l'aide de
Object.keys(myJSONObject)
serait:Mais le point est que si vous vous souciez de la mémoire et que vous souhaitez à l'ensemble de l'objet est supprimé de la mémoire, il est recommandé de le mettre à null avant de supprimer la clé:
L'autre point important ici est d'être prudent quant à vos autres références pour le même objet. Par exemple, si vous créez une variable comme:
Ou d'ajouter un nouveau pointeur vers un autre objet, comme:
Alors, même si vous retirez de votre objet
myJSONObject
, cet objet spécifique ne sera pas supprimé de la mémoire, depuis leregex
variable etmyOtherObject["regex"]
ont encore leurs valeurs. Alors comment pourrions-nous retirer l'objet de la mémoire pour vous?La réponse serait à supprimer toutes les références que vous avez dans votre code, a souligné que l'objet même et aussi pas utiliser
var
états à créer de nouvelles références à cet objet. Ce dernier point concernantvar
états, est l'une des questions les plus cruciales que nous sommes habituellement en face de vous, parce que l'utilisation devar
états de prévenir l'objet créé à partir d'obtenir supprimé.Ce qui signifie dans ce cas, vous ne serez pas en mesure de supprimer cet objet parce que vous avez créé le
regex
variable par l'intermédiaire d'unvar
déclaration, et si vous n':Le résultat serait
false
, ce qui signifie que votre instruction delete n'ont pas été exécutées comme prévu. Mais si vous n'avez pas créé cette variable avant, et vous n'aviezmyOtherObject["regex"]
que votre dernière référence existante, vous auriez pu faire cela simplement en enlevant comme:En d'autres termes, un objet JavaScript se fait tuer dès qu'il n'y a pas de référence à gauche dans votre code de relever à cet objet.
Mise à jour:
Grâce à @AgentME:
Pour obtenir plus d'infos sur
Object.seal
: Objet.le joint d'étanchéité()myJSONObject.regex
's la valeur est une chaîne de caractères et vous pouvez l'affecter à un autre objet, l'autre objet est une copie de cette valeur.ECMAScript 2015 (ou ES6) est venu avec construit-dans Réfléchir objet. Il est possible de supprimer la propriété de l'objet en appelant De réfléchir.deleteProperty() fonction à la cible de l'objet et la propriété clé en tant que paramètres:
qui est équivalent à:
Mais si la propriété de l'objet n'est pas configurable, il ne peut pas être supprimé ni avec deleteProperty fonction, ni opérateur d'effacement:
Objet.freeze() fait toutes les propriétés de l'objet n'est pas configurable (en plus d'autres choses).
deleteProperty
fonction (ainsi que opérateur delete) renvoiefalse
lorsque tente de supprimer toutes ses propriétés. Si la propriété est configurable il retournetrue
, même si la propriété n'existe pas.La différence entre
delete
etdeleteProperty
est lorsque vous utilisez le mode strict:apply
,call
,bind
fonctions...Supposons que vous avez un objet qui ressemble à ceci:
La suppression d'un objet de propriété
Si vous souhaitez utiliser la totalité de la
staff
tableau, la bonne façon de le faire, serait de faire ceci:Alternativement, vous pouvez aussi faire ceci:
De même, la suppression de l'ensemble des étudiants de la matrice serait fait en appelant
delete Hogwarts.students;
oudelete Hogwarts['students'];
.La suppression d'un index de tableau
Maintenant, si vous souhaitez supprimer un seul membre du personnel ou étudiant, la procédure est un peu différente, parce que les deux propriétés sont des tableaux eux-mêmes.
Si vous connaissez l'index de votre membre du personnel, vous pourriez simplement faire ceci:
Si vous ne connaissez pas l'index, vous aurez également à faire une recherche d'index:
Remarque
Alors que vous techniquement pouvez utiliser
delete
pour un tableau, en l'utilisant, on obtiendra des résultats incorrects lors de l'appel par exempleHogwarts.staff.length
plus tard. En d'autres termes,delete
de supprimer l'élément, mais il ne serait pas de mise à jour de la valeur delength
de la propriété. À l'aide dedelete
serait également gâcher votre indexation.Donc, lors de la suppression de valeurs d'un objet, toujours d'abord vous demander si vous avez à traiter avec des propriétés de l'objet ou si vous avez à traiter avec des valeurs de tableau, et de choisir la stratégie appropriée sur cette base.
Si vous voulez expérimenter avec cela, vous pouvez utiliser ce Violon comme un point de départ.
splice
sur un tableau au lieu dedelete
.delete
ne devrait même pas être une chose. C'estsplice
est ce que l'OP a été à la recherche pour.delete
doit être utilisé pour les propriétés de l'objet etsplice
pour les éléments du tableau.delete
sur les tableaux, il serait plus sage de ne pas créer un code centrée autour d'elle à tous les.splice
?splice
.splice
est bonne et rationnelle. Sur de grands ensembles de données tels que les éditeurs de texte, et bien, il y inlies ce qui sépare les meilleurs programmeurs de l'bons programmeurs. Un bon programmeur voudrais juste dire à leur patron est impossible d'avoir de meilleures performances. Le meilleur programmeur serait de trouver une autre manière de stocker les données de ces circonstances pour fournir rapidement de l'insertion et de suppression, sans sacrifier la vitesse à laquelle les données est particulièrement accessible.À l'aide de ES6:
(Déstructuration + Propagation de l'opérateur)
La opérateur delete est la meilleure façon de le faire.
Un exemple vivant à spectacle:
delete
opérateur est en bonne santé en ce qui concerne les garbage collection, il peut être lent de façon inattendue, dans aucune petite partie pour la même raison.Personnellement, j'utilise Underscore.js ou Lodash pour objet de tableaux et de manipulation:
À l'aide de supprimer méthode est la meilleure façon de le faire, comme par MDN description, l'opérateur delete supprime une propriété d'un objet. Ainsi, vous pouvez simplement écrire:
L'extrait de code suivant donne un autre exemple simple:
JS:
Pour en savoir plus et voir plus, visitez le lien ci-dessous:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
Une autre solution, à l'aide de
Array#réduire
.JS:
Cependant, il muter l'objet d'origine. Si vous souhaitez créer un nouvel objet sans la clé spécifiée, suffit d'attribuer la fonction de réduction à une nouvelle variable, par exemple:
(ES6)
JS:
Pour cloner un objet sans propriété:
Par exemple:
Et nous avons besoin de supprimer "un".
1.Explicite prop key:
2.Avec la variable prop key:
3.Cool flèche fonction :
4. Pour de multiples propriétés
Utilisation
Ou
Ce post est très vieux et je trouve cela très utile, donc j'ai décidé de partager la fonction unset j'ai écrit au cas où quelqu'un d'autre voir ce post et de penser pourquoi il n'est pas si simple que ça en PHP unset fonction.
La raison de l'écriture de ce nouveau
unset
fonction, est de garder l'index de toutes les autres variables dans cette classes hash_map. Regardez l'exemple suivant, et de voir comment l'indice de la "test2" n'a pas changé après la suppression d'une valeur dans les classes hash_map.Il y a beaucoup de bonnes réponses ici, mais je veux juste mentionner que lors de l'utilisation de supprimer pour supprimer une propriété en JavaScript, il est souvent judicieux de vérifier d'abord si la propriété existe pour éviter les erreurs.
E. g
En raison de la nature dynamique de JavaScript, il y a souvent des cas où vous simplement ne sais pas si la propriété existe ou pas. Vérifier si obj existe avant le && également fait en sorte que vous ne jetez pas une erreur due à l'appel de la hasOwnProperty() de la fonction sur un objet non défini.
Désolé si cela n'a pas l'ajouter à votre cas d'utilisation spécifiques, mais je pense que c'est un bon design pour s'adapter lors de la gestion des objets et de leurs propriétés.
delete foo.bar;
ne lance une exception si toto est falsy, ou si vous êtes en mode strict et foo est un objet avec une unconfigurable barre de propriété.À l'aide de ramda#dissoc, vous obtiendrez un nouvel objet sans l'attribut
regex
:Vous pouvez également utiliser d'autres fonctions pour obtenir le même effet - omettre, choisir, ...
Essayez la méthode suivante. Attribuer le
Object
la valeur de la propriété àundefined
. Puisstringify
l'objet etparse
.JS:
JSON.parse(JSON.stringify({ ...myObject, regex: undefined }))
Si vous souhaitez supprimer une propriété profondément imbriquée dans l'objet, alors vous pouvez utiliser la fonction récursive avec chemin d'accès à la propriété en tant que deuxième argument:
Exemple:
Vous pouvez simplement supprimer toute propriété d'un objet à l'aide de la
delete
mot-clé.Par exemple:
De supprimer toute propriété, dire
key1
, utilisez ledelete
mot-clé comme ceci:Ou vous pouvez également utiliser le tableau comme notation:
Ref: MDN.
Dan l'affirmation que "supprimer" est très lent et l'indice de référence, il a affiché été mise en doute. J'ai donc effectué le test moi-même en Chrome 59. Il semble que "supprimer" est environ 30 fois plus lent:
Remarque que je purposedly effectué plus d'une "supprimer" dans l'un de la boucle afin de minimiser l'effet causé par les autres opérations.
Envisager la création d'un nouvel objet sans le
"regex"
bien parce que l'original de l'objet peut toujours être référencé par d'autres parties de votre programme. Vous devriez donc éviter de les manipuler.JS:
SyntaxError: Unexpected token '...'. Expected a property name.
?Objet.assign() & Objet.les touches() & Tableau.map()
JS:
JS:
delete myObject.regex;
.Vous pouvez utiliser ES6 déstructuration avec le reste de l'opérateur.
Propriétés peuvent être retirés à l'aide de déstructuration en combinaison avec la reste de l'opérateur. Dans votre exemple, la regex est déstructuré out (ignoré) et le reste de l'propriétés sont retournés comme les autres.
Ou vous pouvez dynamiquement exclure les propriétés de ce type,
Essayer cette
Bonjour, Vous Pouvez essayer cette simple une sorte
Propriété de Suppression en JavaScript
Il ya beaucoup de différentes options présentées sur cette page, non pas parce que la plupart des options sont mauvais, ou parce que les réponses sont en doubles—mais parce que la technique appropriée dépend de la situation où vous êtes et les objectifs des tâches que vous et/ou votre équipe tentent de réaliser. Pour répondre à votre question, sans équivoque, on a besoin de savoir:
Une fois ces quatre questions ont été répondues, il y a essentiellement quatre catégories de propriété de "l'enlèvement" en JavaScript a choisi de partir afin de répondre à vos objectifs. Ils sont:
Mutative propriété de l'objet de la suppression, dangereux
Cette catégorie est pour les opérations sur les objets littéraux ou des instances de l'objet lorsque vous voulez garder/continuer à utiliser la référence d'origine et ne sont pas en utilisant des apatrides principes fonctionnels dans votre code. Un exemple de pièce de syntaxe dans cette catégorie:
Cette catégorie est la plus ancienne, la plus simple & plus largement pris en charge catégorie de la propriété de l'enlèvement. Il prend en charge
Symbol
& index de tableau en plus de chaînes et fonctionne dans toutes les versions de JavaScript à l'exception de la toute première version. Cependant, il est mutative qui viole certains principes de programmation et a des implications sur les performances. Il peut également résulter de ce type d'exception lorsqu'il est utilisé sur non les propriétés configurables en mode strict.Rest propriété de chaîne d'omission
Cette catégorie est pour exploitation sur un objet ou un tableau d'instances de nouvelles ECMAScript saveurs lorsqu'un non-mutative approche et vous n'avez pas besoin de compte pour les touches de Symbole:
Mutative propriété de l'objet de la suppression, coffre-fort
Cette catégorie est pour les opérations sur les objets littéraux ou des instances de l'objet lorsque vous voulez garder/continuer à utiliser la référence d'origine tout en les protégeant contre les exceptions d'être jeté sur unconfigurable propriétés:
En outre, alors que la mutation des objets en place n'est pas apatride, vous pouvez utiliser le caractère fonctionnel de
Reflect.deleteProperty
de faire une application partielle et d'autres techniques fonctionnelles qui ne sont pas possible avecdelete
consolidés.La syntaxe de base de la chaîne de propriété omission
Cette catégorie est pour exploitation sur un objet ou un tableau d'instances de nouvelles ECMAScript saveurs lorsqu'un non-mutative approche et vous n'avez pas besoin de compte pour les touches de Symbole:
Bibliothèque de base de la propriété omission
Cette catégorie est généralement permet une plus grande flexibilité fonctionnelle, y compris la comptabilité, de Symboles, & omission plus d'une propriété dans une déclaration:
À l'aide de lodash
À L'Aide De Ramda
@johnstock, on peut aussi utiliser du JavaScript prototypage concept d'ajouter des méthodes à des objets de supprimer tout passé clés disponibles dans l'objet appelant.
Réponses ci-dessus sont appréciés.
Très simple:
J'ai utilisé lodash "unset" à réaliser pour objet imbriqué aussi.. que ce besoin d'écrire de petits logique pour obtenir le chemin de la clé de propriété qui s'attend à en omettre méthode.
JS:
HTML:
JS:
vous pouvez utiliser le
delete
opérateur de ci-dessous.L'opérateur delete a aussi un
return value.
Si elle réussit à la suppression d'une propriété, il retournera true. Si elle ne parvient pas à supprimer une propriété parce que la propriété est unwritable ilreturn false
, ou si en mode strict, il lèvera une erreur.Pour
supprimer myObject["regex"];
Aussi, vous savez index de clé , par exemple. Vous devez supprimer 2ème clé(regex)
puis
Beaucoup de temps nous avons besoin de l'indice de base de la suppression dans l'objet Mais n'oubliez pas de clés dans l'objet peut être de haut en bas position de sorte s'il vous plaît attention lors de son utilisation il
Que beaucoup ont déjà dit, vous pouvez utiliser soit "supprimer"(javascript propriété) ou "annuler"(à l'aide de lodash).
Vous pouvez également utiliser lodash propriété "ramasser" de choisir seulement nécessaire propriétés de l'objet.Il aidera quand vous arrivez à la suppression de plusieurs propriétés de l'objet.
Utilisation comme ci-dessous:
On peut enlever n'importe quelle propriété d'un objet javascript en utilisant suivantes:
exemple:
de sortie :
Vous pouvez utiliser la notation de point ou de support de la notation
Vous pouvez utiliser le filtre comme ci-dessous
JS: