Supposons que je crée un objet comme suit:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Quelle est la meilleure façon de supprimer la propriété regex
pour se retrouver avec nouveau myObject
comme suit?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
javascript
javascript-objects
johnstok
la source
la source
delete
serait l'option la plus lente car c'est une opération réelle plutôt que les deux autres qui ne sont que de simples affectations. Mais le point crucial de la question est que l' attribution de la propriété ànull
ouundefined
ne supprime pas réellement la propriété de l'objet, mais définit la place que la propriété égale à une valeur constante particulière. (Les réponses ci-dessous expliquent pourquoi il s'agit d'une différence significative.)Réponses:
Comme ça:
Démo
Pour quiconque souhaite en savoir plus à ce sujet, l'utilisateur de Stack Overflow kangax a écrit un article de blog incroyablement détaillé sur la
delete
déclaration sur son blog, Understanding delete . C'est fortement recommandé.la source
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 */
Les objets en JavaScript peuvent être considérés comme des correspondances entre les clés et les valeurs. L'
delete
opérateur est utilisé pour supprimer ces clés, plus communément appelées propriétés d'objet, une à la fois.L'
delete
opérateur ne libère pas directement la mémoire, et il diffère de simplement attribuer la valeur denull
ouundefined
à une propriété, en ce que la propriété elle - même est supprimée de l'objet. Notez que si la valeur d'une propriété supprimée était un type de référence (un objet) et qu'une autre partie de votre programme contient toujours une référence à cet objet, cet objet ne sera bien sûr pas récupéré tant que toutes les références à celui-ci n'auront pas disparu.delete
ne fonctionnera que sur les propriétés dont le descripteur les marque comme configurables.la source
Cela fonctionne dans Firefox et Internet Explorer, et je pense que cela fonctionne dans tous les autres.
la source
L'
delete
opérateur est utilisé pour supprimer les propriétés des objets.Notez que, pour les tableaux, ce n'est pas la même chose que de supprimer un élément . Pour supprimer un élément d'un tableau, utilisez
Array#splice
ouArray#pop
. Par exemple:Détails
delete
en JavaScript a une fonction différente de celle du mot-clé en C et C ++: il ne libère pas directement la mémoire. Au lieu de cela, son seul but est de supprimer les propriétés des objets.Pour les tableaux, la suppression d'une propriété correspondant à un index crée un tableau clairsemé (c'est-à-dire un tableau contenant un "trou"). La plupart des navigateurs représentent ces indices de tableau manquants comme «vides».
Notez que
delete
ne se déplace pasarray[3]
dansarray[2]
.Différentes fonctions intégrées en JavaScript gèrent différemment les tableaux clairsemés.
for...in
sautera complètement l'index vide.Une
for
boucle traditionnelle renverraundefined
la valeur à l'index.Toute méthode utilisant
Symbol.iterator
retourneraundefined
la valeur à l'index.forEach
,map
Etreduce
sautera les index manquant.Ainsi, l'
delete
opérateur ne doit pas être utilisé dans le cas d'utilisation courant de suppression d'éléments d'un tableau. Les tableaux ont des méthodes dédiées pour supprimer des éléments et réallouer la mémoire:Array#splice()
etArray#pop
.Array # splice (start [, deleteCount [, item1 [, item2 [, ...]]]])
Array#splice
mute le tableau et renvoie tous les index supprimés.deleteCount
les éléments sont supprimés de l'indexstart
etitem1, item2... itemN
sont insérés dans le tableau à partir de l'indexstart
. SideleteCount
est omis, les éléments de startIndex sont supprimés à la fin du tableau.Il y a aussi un nom similaire, mais différente, fonction sur
Array.prototype
:Array#slice
.Array # slice ([début [, fin]])
Array#slice
est non destructif et renvoie un nouveau tableau contenant les indices indiqués destart
àend
. Si elleend
n'est pas spécifiée, elle prend par défaut la fin du tableau. Siend
est positif, il spécifie l' index non inclus de base zéro sur lequel s'arrêter. S'ilend
est négatif, il spécifie l'index sur lequel s'arrêter en comptant à partir de la fin du tableau (par exemple, -1 omettra l'index final). Siend <= start
, le résultat est un tableau vide.Array # pop
Array#pop
supprime le dernier élément d'un tableau et renvoie cet élément. Cette opération modifie la longueur du tableau.la source
delete
et de créer une fonction Garbage Collection pour le nettoyer.splice
dans votre montage, maisremove
devrait l'êtreArray.prototype.remove = function(index) { this.splice(index, 1); };
Vieille question, réponse moderne. À l'aide de la déstructuration d'objets, une fonctionnalité ECMAScript 6 , c'est aussi simple que:
Ou avec l'exemple de questions:
Vous pouvez le voir en action dans l'éditeur d'essai Babel.
Éditer:
Pour réaffecter à la même variable, utilisez a
let
:la source
regex
vous pouvez également l' assigner à toute autre variable, par exemple_
, ce qui est utilisé dans des langues comme Aller à jeter un résultat:const { regex: _, ...newObject } = myObject;
.const { [key], ...newObject } = myObject;
mais ce n'est pas le cas, donc je ne pense pas que ce soit possible avec la déstructuration.freeze()
lesseal()
objets 'd et ' d, 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 logique de supprimer une propriété d'un objet gelé / scellé de toute façon, étant donné que le but est de donner certaines garanties sur vos structures de données, ce que ce modèle minerait. Pour les cas où vous devez duper de manière non destructive un objet mais sans certaines de ses propriétés, c'est parfaitSyntaxe de propagation (ES6)
À qui en a besoin ...
Pour terminer la réponse @Koen dans ce fil, au cas où vous voudriez supprimer une variable dynamique en utilisant la syntaxe étalée, vous pouvez le faire comme ceci:
*
foo
sera une nouvelle variable avec la valeura
(qui est 1).RÉPONSE ÉTENDUE 😇
Il existe peu de façons courantes de supprimer une propriété d'un objet.
Chacun a ses avantages et ses inconvénients ( vérifiez cette comparaison de performances ):
Opérateur de suppression
Lisible et court, cependant, ce n'est peut-être pas le meilleur choix si vous travaillez sur un grand nombre d'objets car ses performances ne sont pas optimisées.
Réaffectation
Plus de 2 fois plus rapide que
delete
, cependant, la propriété n'estpassupprimée et peut être itérée.Opérateur de diffusion
Cet
ES6
opérateur nous permet de renvoyer un tout nouvel objet, à l'exclusion de toute propriété, sans muter l'objet existant. L'inconvénient est qu'il a les plus mauvaises performances de ce qui précède et qu'il n'est pas recommandé de l'utiliser lorsque vous devez supprimer de nombreuses propriétés à la fois.la source
Une autre alternative consiste à utiliser la bibliothèque Underscore.js .
Notez que
_.pick()
et les_.omit()
deux renvoient une copie de l'objet et ne modifient pas directement l'objet d'origine. L'affectation du résultat à l'objet d'origine devrait faire l'affaire (non représentée).Référence: link _.pick (objet, * touches)
Renvoie une copie de l'objet, filtrée pour n'avoir que des valeurs pour les clés en liste blanche (ou tableau de clés valides).
Référence: link _.omit (objet, * touches)
Renvoie une copie de l'objet, filtrée pour omettre les clés sur liste noire (ou tableau de clés).
Pour les tableaux,
_.filter()
et_.reject()
peut être utilisé de manière similaire.la source
_.omit(collection, key.toString())
delete obj[prop]
ce qui est ~ 100x plus lent queobj[prop] = undefined
.Le terme que vous avez utilisé dans le titre de votre question
Remove a property from a JavaScript object
peut être interprété de différentes manières. La première consiste à la supprimer pour toute la mémoire et la liste des clés d'objet ou l'autre consiste simplement à la supprimer de votre objet. Comme cela a été mentionné dans d'autres réponses, ledelete
mot-clé est la partie principale. Disons que vous avez votre objet comme:Si tu fais:
le résultat serait:
Vous pouvez supprimer cette clé spécifique de vos clés d'objet comme:
La clé de vos objets à utiliser
Object.keys(myJSONObject)
serait alors:Mais le fait est que si vous vous souciez de la mémoire et que vous souhaitez que l'ensemble de l'objet soit supprimé de la mémoire, il est recommandé de le définir sur null avant de supprimer la clé:
L'autre point important ici est de faire attention à vos autres références au même objet. Par exemple, si vous créez une variable comme:
Ou ajoutez-le en tant que nouveau pointeur vers un autre objet comme:
Ensuite, même si vous le supprimez de votre objet
myJSONObject
, cet objet spécifique ne sera pas supprimé de la mémoire, car laregex
variable amyOtherObject["regex"]
toujours ses valeurs. Alors, comment pourrions-nous supprimer l'objet de la mémoire à coup sûr?La réponse serait de supprimer toutes les références que vous avez dans votre code, pointé vers cet objet même et également de ne pas utiliser d'
var
instructions pour créer de nouvelles références à cet objet . Ce dernier point concernant lesvar
instructions est l'un des problèmes les plus cruciaux auxquels nous sommes généralement confrontés, car l'utilisation d'var
instructions empêcherait la suppression de l'objet créé.Ce qui signifie que dans ce cas, vous ne pourrez pas supprimer cet objet car vous avez créé la
regex
variable via unevar
instruction, et si vous le faites:Le résultat serait
false
, ce qui signifie que votre instruction de suppression n'a pas été exécutée comme prévu. Mais si vous n'aviez pas créé cette variable auparavant, et que vous n'aviez quemyOtherObject["regex"]
votre dernière référence existante, vous auriez pu le faire simplement en la supprimant comme:En d'autres termes, un objet JavaScript est tué dès qu'il n'y a plus de référence dans votre code pointant vers cet objet.
Mise à jour: Merci à @AgentME:
Pour obtenir plus d'informations sur
Object.seal
: Object.seal ()la source
myJSONObject.regex
la valeur de est une chaîne et que vous l'assignez à un autre objet, l'autre objet a une copie de cette valeur.ECMAScript 2015 (ou ES6) est livré avec un objet Reflect intégré . Il est possible de supprimer la propriété d'objet en appelant la fonction Reflect.deleteProperty () avec l'objet cible et la clé de propriété comme paramètres:
ce qui équivaut à:
Mais si la propriété de l'objet n'est pas configurable, elle ne peut être supprimée ni avec la fonction deleteProperty ni avec l'opérateur delete:
Object.freeze () rend toutes les propriétés de l'objet non configurables (en plus d'autres choses).
deleteProperty
La fonction (ainsi que l' opérateur de suppression ) renvoiefalse
lorsque tente de supprimer l'une de ses propriétés. Si la propriété est configurable, elle revienttrue
, même si la propriété n'existe pas.La différence entre
delete
etdeleteProperty
est lors de l'utilisation du mode strict:la source
apply
,call
,bind
fonctions ...Supposons que vous ayez un objet qui ressemble à ceci:
Suppression d'une propriété d'objet
Si vous souhaitez utiliser l'intégralité du
staff
tableau, la manière appropriée de le faire serait de procéder comme suit:Alternativement, vous pouvez également faire ceci:
De même, la suppression de l'ensemble du tableau des étudiants se ferait en appelant
delete Hogwarts.students;
oudelete Hogwarts['students'];
.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, car les deux propriétés sont des tableaux eux-mêmes.
Si vous connaissez l'index de votre membre du personnel, vous pouvez simplement le faire:
Si vous ne connaissez pas l'index, vous devrez également effectuer une recherche d'index:
Remarque
Bien que vous puissiez techniquement l'utiliser
delete
pour un tableau, son utilisation entraînerait des résultats incorrects lors d'un appel par exempleHogwarts.staff.length
plus tard. En d'autres termes,delete
supprimerait l'élément, mais ne mettrait pas à jour la valeur de lalength
propriété. L'utilisationdelete
gâcherait également votre indexation.Ainsi, lorsque vous supprimez des valeurs d'un objet, considérez toujours d'abord si vous avez affaire à des propriétés d'objet ou si vous avez affaire à des valeurs de tableau, et choisissez la stratégie appropriée en fonction de cela.
Si vous voulez expérimenter cela, vous pouvez utiliser ce violon comme point de départ.
la source
splice
sur un tableau au lieu dedelete
.delete
ne devrait même pas être une chose. C'estsplice
ce que le PO recherchait.delete
devrait être utilisé pour les propriétés des objets etsplice
pour les éléments du tableau.delete
sur des tableaux, il serait plus sage de ne pas créer du tout de code centré autour de lui.Utilisation d'ES6:
(Opérateur Destructuration + Spread)
la source
J'utilise personnellement Underscore.js ou Lodash pour la manipulation d'objets et de tableaux:
la source
L' opérateur de suppression est le meilleur moyen de le faire.
Un exemple en direct pour montrer:
la source
delete
opérateur est saine en ce qui concerne la collecte des ordures , elle peut être étonnamment lente , en grande partie pour la même raison.Pour cloner un objet sans propriété:
Par exemple:
Et nous devons supprimer «a».
1. avec clé prop explicite:
2. avec clé prop variable:
3.Fonction de flèche froide 😎:
4. Pour plusieurs propriétés
Usage
Ou
la source
L' utilisation de la méthode de suppression est la meilleure façon de le faire, selon la description MDN, l'opérateur de suppression supprime une propriété d'un objet. Vous pouvez donc simplement écrire:
L'extrait de code suivant donne un autre exemple simple:
Pour plus d'informations et voir plus d'exemples, visitez le lien ci-dessous:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
la source
Une autre solution, en utilisant
Array#reduce
.Cependant, il mute l'objet d'origine. Si vous souhaitez créer un nouvel objet sans la clé spécifiée, affectez simplement la fonction de réduction à une nouvelle variable, par exemple:
(ES6)
la source
Ce message est très ancien et je le trouve très utile, j'ai donc décidé de partager la fonction non définie que j'ai écrite au cas où quelqu'un d'autre verrait ce message et se demander pourquoi ce n'est pas aussi simple que dans la fonction non définie PHP.
La raison de l'écriture de cette nouvelle
unset
fonction est de conserver l'index de toutes les autres variables dans cette table de hachage. Regardez l'exemple suivant et voyez comment l'index de "test2" n'a pas changé après avoir supprimé une valeur de hash_map.la source
Il y a beaucoup de bonnes réponses ici, mais je veux juste dire que lorsque vous utilisez delete pour supprimer une propriété en JavaScript, il est souvent sage de vérifier d'abord si cette propriété existe pour éviter les erreurs.
Par exemple
En raison de la nature dynamique de JavaScript, il y a souvent des cas où vous ne savez tout simplement pas si la propriété existe ou non. Vérifier si obj existe avant le && s'assure également que vous ne lancez pas d'erreur en raison de l'appel de la fonction hasOwnProperty () sur un objet non défini.
Désolé si cela ne s'ajoute pas à votre cas d'utilisation spécifique, mais je pense que c'est une bonne conception à adapter lors de la gestion des objets et de leurs propriétés.
la source
delete foo.bar;
lève une exception uniquement si foo est faux, ou si vous êtes en mode strict et foo est un objet avec une propriété de barre non configurable.En utilisant 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, ...
la source
Essayez la méthode suivante. Attribuez la
Object
valeur de la propriété àundefined
. Ensuite,stringify
l'objet etparse
.la source
JSON.parse(JSON.stringify({ ...myObject, regex: undefined }))
Si vous souhaitez supprimer une propriété profondément imbriquée dans l'objet, vous pouvez utiliser la fonction récursive suivante avec chemin d'accès à la propriété comme deuxième argument:
Exemple:
la source
Vous pouvez simplement supprimer n'importe quelle propriété d'un objet en utilisant le
delete
mot - clé.Par exemple:
Pour supprimer une propriété, par exemple
key1
, utilisez ledelete
mot - clé comme ceci:Ou vous pouvez également utiliser une notation de type tableau:
Réf: MDN .
la source
Object.assign () & Object.keys () & Array.map ()
la source
L'affirmation de Dan selon laquelle «supprimer» est très lente et la référence qu'il a publiée étaient douteuses. J'ai donc effectué le test moi-même dans Chrome 59. Il semble que "supprimer" soit environ 30 fois plus lent:
Notez que j'ai délibérément effectué plus d'une opération de suppression dans un cycle de boucle pour minimiser l'effet provoqué par les autres opérations.
la source
Envisagez de créer un nouvel objet sans la
"regex"
propriété, car l'objet d'origine pourrait toujours être référencé par d'autres parties de votre programme. Vous devez donc éviter de le manipuler.la source
SyntaxError: Unexpected token '...'. Expected a property name.
?Suppression de propriété en JavaScript
Il existe de nombreuses options différentes présentées sur cette page, non pas parce que la plupart des options sont erronées - ou parce que les réponses sont des doublons - mais parce que la technique appropriée dépend de la situation dans laquelle vous vous trouvez et des objectifs des tâches que vous et / ou vous l'équipe essaie de réaliser. Pour répondre sans équivoque à votre question, il faut savoir:
Une fois que ces quatre questions ont été répondues, il existe essentiellement quatre catégories de «suppression de propriété» en JavaScript parmi lesquelles choisir afin d'atteindre vos objectifs. Elles sont:
Suppression de propriété d'objet mutatif, dangereuse
Cette catégorie est destinée à fonctionner sur des littéraux d'objet ou des instances d'objet lorsque vous souhaitez conserver / continuer à utiliser la référence d'origine et que vous n'utilisez pas de principes fonctionnels sans état dans votre code. Un exemple de syntaxe dans cette catégorie:
Cette catégorie est la catégorie la plus ancienne, la plus simple et la plus largement prise en charge pour l'enlèvement de propriété. Il prend en charge les
Symbol
index & array en plus des chaînes et fonctionne dans toutes les versions de JavaScript, à l'exception de la toute première version. Cependant, c'est une mutation qui viole certains principes de programmation et a des implications en termes de performances. Il peut également entraîner des exceptions non capturées lorsqu'il est utilisé sur des propriétés non configurables en mode strict .Omission de propriété de chaîne basée sur le repos
Cette catégorie est destinée à fonctionner sur des instances d'objets ou de tableaux simples dans des versions ECMAScript plus récentes lorsqu'une approche non mutative est souhaitée et que vous n'avez pas besoin de prendre en compte les clés de symboles:
Suppression de propriété d'objet mutatif, sûre
Cette catégorie est destinée à fonctionner sur des littéraux d'objet ou des instances d'objet lorsque vous souhaitez conserver / continuer à utiliser la référence d'origine tout en évitant que des exceptions ne soient levées sur des propriétés non configurables:
De plus, bien que la mutation d'objets en place ne soit pas sans état, vous pouvez utiliser la nature fonctionnelle de
Reflect.deleteProperty
pour effectuer une application partielle et d'autres techniques fonctionnelles qui ne sont pas possibles avec lesdelete
instructions.Omission de propriété de chaîne basée sur la syntaxe
Cette catégorie est destinée à fonctionner sur des instances d'objets ou de tableaux simples dans des versions ECMAScript plus récentes lorsqu'une approche non mutative est souhaitée et que vous n'avez pas besoin de prendre en compte les clés de symboles:
Omission de propriété basée sur la bibliothèque
Cette catégorie permet généralement une plus grande flexibilité fonctionnelle, notamment la prise en compte des symboles et l'omission de plusieurs propriétés dans une seule instruction:
la source
la source
delete myObject.regex;
.Vous pouvez utiliser la déstructuration ES6 avec l'opérateur de repos.
Les propriétés peuvent être supprimées en utilisant la déstructuration en combinaison avec l' opérateur de repos . Dans votre exemple, l'expression régulière est déstructurée (ignorée) et le reste des propriétés est renvoyé en tant que reste.
Ou vous pouvez exclure dynamiquement des propriétés comme celle-ci,
la source
Nous pouvons supprimer n'importe quelle propriété d'un objet javascript en utilisant ce qui suit:
exemple:
la source
Essaye ça
la source