7186 votes

Comment faire pour supprimer une propriété d'un objet JavaScript

Dire que j'ai créer un objet comme ceci:

var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

Quelle est la meilleure façon d'enlever la propriété 'regex' à la fin avec cette nouvelle myJSONObject:

var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI"};

9523voto

nickf Points 185423

Comme ceci:

delete myJSONObject.regex;
// or,
delete myJSONObject['regex'];
// or,
var prop = "regex";
delete myJSONObject[prop];

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 l' delete déclaration sur son blog, la Compréhension supprimer. Il est fortement recommandé.

1082voto

Dan Points 7078

Opérateur de delete est lent de façon inattendue!

Regardez l' indice de 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 à "l'alternative", 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 dans les boucles 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 à l' undefined ?

Un objet est une paire clé-valeur. Ce que j'appelle une "valeur" est une primitive ou une référence à un autre objet, connecté à la "clé".

Utiliser 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.

 var obj = {
     field: 1     
 };
 delete obj.field;

Utilisez le réglage d' 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é par undefined. Comprendre, c' for..in boucle sera toujours effectuer une itération sur cette touche.

 var obj = {
     field: 1     
 };
 obj.field = undefined;

En utilisant cette méthode, pas tous les moyens de détermination de l'existence de la propriété fonctionnent 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 à propos de for..in boucle.

 console.log('* -> "Takes prototype inheritance into consideration, that means it lookups all over prototype chain too."');

 console.log(obj.field === undefined, 'obj.field === undefined', 'You get "undefined" value when querying for "field" in object-hashmap. *');

 console.log(obj["field"] === undefined, 'obj["field"] === undefined', 'Just another way to query (equivalent). *');

 console.log(typeof obj.field === "undefined", 'typeof obj.field === "undefined"', 'Get the value attached to "field" key, and check it\'s type is "undefined". *');

 console.log(! ("field" in obj), '! ("field" in obj)', 'This statement returns true if "field" key exists in the hashmap. False otherwise. *');

 console.log(obj.hasOwnProperty("field"), 'obj.hasOwnProperty("field")', 'This statement returns true if 'field' key exists in the hashmap. The ONLY way NOT to lookup for property in the prototype chain!');
 //Object.keys().indexOf() is an overkill :)

 var counter = 0,
     key;
 for (key in obj) {
     counter++;
 }
 console.assert(counter === 0, 'counter === 0', '"field" is not iterated using "for .. in" loop. *');

304voto

redsquare Points 47518
var myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

delete myJSONObject.regex;

alert ( myJSONObject.regex);

Cela fonctionne dans Firefox et Internet Explorer, et je pense que cela fonctionne dans tous les autres.

287voto

B1KMusic Points 1088

Dans les tableaux, à la différence des objets, en utilisant le mot clé delete feuilles null ou undefined des artefacts.

var array = [1,2,3,4];
delete array[2];
//Expected result --> [1,2,4]
//Actual result   --> [1,2,null,4]

Cela peut être problématique si le tableau doit être précis. Par exemple, dans une application web qui utilise JSON sérialisé tableaux de tenir données dans localStorage, et utilise les indices ainsi que les valeurs à l'intérieur. Il en résulte "null" qui apparaissent, ou si vous utilisez une instruction if, complètement sauter de nombres. Un autre problème est que la sérialisation JSON enregistre également l' null valeurs, ce qui pourrait conduire rapidement dans le désordre.

Au lieu de cela, ce que vous voulez faire est de prendre plutôt une sorte d' garbage collection méthode

Array.prototype.remove = function(index){
    delete this[index];
    return this;
};
Array.prototype.clean = function(){
    var arr1 = this, arr2 = [];
    for(var a in arr1){
        if(arr1[a]&&arr1.hasOwnProperty(a)){
            arr2.push(arr1[a]);
        }
    }
    this.splice(0);
    for(var b in arr2){
        if(arr2.hasOwnProperty(b)){
            this.push(arr2[b]);
        }
    }
    return this;
};
var array = [1,2,3,4];
array.remove(2).clean();
// Result --> [1,2,4]

Ou, de façon plus concise, vous pouvez simplement retourner un propre groupe après les supprimer, comme ceci:

Array.prototype.remove = function(index){
  delete this[index];
  return this.clean();
};

Ou vous pouvez simplement utiliser de tableau.splice comme ceci:

Array.prototype.remove = function(index){
  this.splice(index,1);
}

119voto

Thaddeus Albers Points 909

Une autre alternative est d'utiliser le trait de soulignement de la bibliothèque. http://underscorejs.org/

Notez que _.pick() et _.omit() à la fois renvoyer une copie de l'objet et de 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: http://underscorejs.org/#pick _.pick(objet, *les touches) Retour 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).

var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

_.pick(myJSONObject, "ircEvent", "method");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};

référence: http://underscorejs.org/#omit _.omettre(objet, *les touches) Retour une copie de l'objet, filtrée à omettre la sur la liste noire des clés (ou d'une matrice de touches).

var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

_.omit(myJSONObject, "regex");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};

Pour les tableaux, _.filter() et _.reject() peut être utilisée de manière similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X