J'aimerais supprimer certains membres d'un objet (pour des raisons d'argumentation, ceux dont les touches commencent par '_'). Qu'est-ce qu'un moyen élégant de faire ça? La voie naïve serait: mais qui modifie l'objet sous-jacent pendant l'itération. Dans le noeud au moins, je suppose que je pourrais p> ou redémarrer l'itération chaque fois que quelque chose est supprimé avec une boucle imbriquée maladroite. P> y a-t-il de meilleures solutions? P> Edit: En test juste maintenant, dans le nœud.js au moins, la solution naïve semble réellement fonctionner. Il est certainement possible que ... IN est (obligatoire d'être) mis en œuvre en toute sécurité. Quelqu'un sache? P> p>
4 Réponses :
Pourquoi ne pas créer une liste des noms à supprimer comme
Object.keys(obj).filter(function (v) {
//filter the object values/keys by some conditions
}).forEach( del.bind(obj) );
function del (v) {
delete this[v];
}
Merci. Je ne connaissais pas le filtre code>.
Une alternative consiste à créer une fonction renvoyant un objet filtré. Je préférerais cette solution afin d'éviter les effets collatéraux sur d'autres parties du code tenant une référence à l'objet modifié.
function filterObject(obj) {
var filtered = new Object();
for (var i in obj)
if (i[0] != '_')
filtered[i] = obj[i];
return filtered;
}
Vous n'avez pas besoin de vous en soucier. Un extrait pour Spécification linguistique ECMAScript §12.6.4 Etats explicitement (souligné par moi): p>
la mécanique et l'ordre d'énumérer les propriétés (étape 6.a dans le Premier algorithme, étape 7.a dans la seconde) n'est pas spécifié. Les propriétés de l'objet énumérés peuvent être supprimées lors de l'énumération. Si une propriété qui n'a pas encore été visitée pendant l'énumération est supprimée, il ne sera pas visité. strong> si nouveau les propriétés sont ajoutées à l'objet énuméré lors de énumération, les propriétés nouvellement ajoutées ne sont pas garanties visité dans l'énumération active. Un nom de propriété ne doit pas être visité plus d'une fois dans n'importe quelle énumération. P> blockQuote>
-1 - "Si une propriété qui n'a pas encore été visitée lors de l'énumération" - je pense que ce n'est pas le cas ici.
@thejh, puis précédant la sensitude s'applique. pour..in code> est totalement sûr pour la suppression de la propriété conformément à la norme.
La modification de l'objet lors du
pour ... dans code> la boucle cause un problème? Je ne vois pas comment il est très différent de modifier l'objet dans leforeach () code> rappel, après tout.Je suppose que
objet.keys code> prend un instantané des touches de l'objet. Peut-être que ce n'est pas vrai.... et présumer que
pour (... in ...) code> ne prend pas un instantané de l'objet.Ah désolé; Je comprends ce que tu veux dire maintenant. Je ne suis toujours pas sûr que
pour ... dans code> échouerait dans ce cas mais c'est une question intéressante.Vous pouvez utiliser JSON.PARSE & JSON.Stringify avec une fonction de remplacement, comme la fonction
(touche, valeur) {retour (touche [0] == "_")? indéfini: valeur; } code>. Cela fonctionnera uniquement avec des éléments sérialisables JSON