En JavaScript, j'ai créé un objet comme ceci:
var data = {
'PropertyA': 1,
'PropertyB': 2,
'PropertyC': 3
};
Est-il possible d'ajouter d'autres propriétés à cet objet après sa création initiale si le nom des propriétés n'est pas déterminé avant l'exécution? c'est à dire
var propName = 'Property' + someUserInput
//imagine someUserInput was 'Z', how can I now add a 'PropertyZ' property to
//my object?
javascript
Lee D
la source
la source
object["property"]
n'est pas exactement la même chose quearray[4]
le premier n'a pas été créé comme un vrai tableau.data["PropertyD"]
àdata[function_to_get_property_name()]
semble insignifiant.ES6 pour la victoire!
Si vous vous connectez
data
vous obtenez ceci:Cela utilise la nouvelle syntaxe de propriété calculée et les nouveaux littéraux de modèle .
la source
obj[propname]
). Au lieu de cela, j'ai pu l'utiliser avec la syntaxe de propagation d'objet.var a = {}; a["dynamic-" + prop] = true;
a
. (Surtout lors de l'utilisation de packages comme redux)Oui c'est possible. En supposant:
Soit:
ou
La première méthode est préférée. eval () a des problèmes de sécurité évidents si vous utilisez des valeurs fournies par l'utilisateur, alors ne l'utilisez pas si vous pouvez l'éviter mais cela vaut la peine de savoir qu'il existe et ce qu'il peut faire.
Vous pouvez référencer cela avec:
ou
ou
la source
$("#mySelector").data("propertyname", myvalue);
pour définir etvar myValue=$("#mySelector").data("propertyname");
récupérer la valeur. Même des objets complexes (listes, tableaux ...) peuvent être ajoutés de cette façon.Je sais que la question est parfaitement répondue, mais j'ai également trouvé une autre façon d'ajouter de nouvelles propriétés et je voulais la partager avec vous:
Vous pouvez utiliser la fonction
Object.defineProperty()
Trouvé sur Mozilla Developer Network
Exemple:
la source
defineProperties
(pluriel).Object.defineProperty
n'est pas censé être l'outil de commodité facile, mais celui avec le contrôle à grain fin. Si vous n'avez pas besoin de ce contrôle supplémentaire, ce n'est pas le bon outil à choisir.Object.defineProperty(obj, prop, valueDescriptor)
est beaucoup plus lent et plus difficile à optimiser que V8 pour le V8obj[prop] = value
;ES6 introduit des noms de propriété calculés, qui vous permettent de faire
la source
Ici, en utilisant votre notation:
la source
Vous pouvez ajouter autant de propriétés que vous le souhaitez simplement en utilisant la notation par points:
ou :
pour les touches dynamiques.
la source
en plus de toutes les réponses précédentes, et au cas où vous vous demandez comment nous allons écrire des noms de propriétés dynamiques dans le futur en utilisant des noms de propriétés calculés (ECMAScript 6), voici comment:
référence: Comprendre ECMAScript 6 - Nickolas Zakas
la source
Juste un ajout à la réponse d'Aeing ci-dessus. Vous pouvez définir une fonction pour encapsuler la complexité de defineProperty comme mentionné ci-dessous.
référence: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#constructorpatternjavascript
la source
Vous pouvez ajouter des propriétés dynamiquement en utilisant certaines des options ci-dessous:
Dans votre exemple:
Vous pouvez définir une propriété avec une valeur dynamique des deux manières suivantes:
ou
Encore plus ... si votre clé est également dynamique, vous pouvez définir en utilisant la classe Object avec:
où les données sont votre objet, la clé est la variable pour stocker le nom et la valeur de la clé est la variable pour stocker la valeur.
J'espère que ça aide!
la source
Je sais qu'il y a déjà plusieurs réponses à ce message, mais je n'en ai pas vu une dans laquelle il existe plusieurs propriétés et elles se trouvent dans un tableau. Et cette solution est d'ailleurs pour ES6.
Par exemple, disons que nous avons un tableau nommé personne avec des objets à l'intérieur:
Vous pouvez donc ajouter une propriété avec la valeur correspondante. Disons que nous voulons ajouter une langue avec une valeur par défaut EN .
le tableau Person deviendrait maintenant comme ceci:
la source
Person = Person.map(code here)
. Mais le fait est que vous pouvez facilement ajouter des propriétés à un objet existantES6
.La manière la plus simple et la plus portable est.
Basé sur la réponse #abeing!
la source
Soyez prudent lorsque vous ajoutez une propriété à l'objet existant à l'aide de la méthode . (Point) .
(.dot) La méthode d'ajout d'une propriété à l'objet ne doit être utilisée que si vous connaissez la «clé» au préalable, sinon utilisez la méthode [bracket] .
Exemple:
Notez le problème dans le journal de fin de console - «clé: 1999» au lieu de Property6: 6, Property7: 7, ........., Property1999: 1999 . Ainsi, la meilleure façon d'ajouter une propriété créée dynamiquement est la méthode [bracket].
la source
Un bon moyen d'accéder à partir de noms de chaînes dynamiques qui contiennent des objets (par exemple object.subobject.property)
Exemple:
eval fonctionne pour la valeur de lecture, mais la valeur d'écriture est un peu plus difficile.
Une version plus avancée (créer des sous-classes si elles n'existent pas et autoriser les objets au lieu des variables globales)
Exemple:
C'est la même chose que o.object.subobject.property
la source
Voici comment j'ai résolu le problème.
Génère l'objet suivant:
la source
Cela peut être utile si une nouvelle propriété mixte est ajoutée au moment de l'exécution:
Cependant, l'opérateur réparti utilise une copie superficielle, mais ici, nous nous assignons des données, donc ne perdons rien
la source
Un moyen facile et parfait
Si vous souhaitez l'appliquer sur un tableau de données (version ES6 / TS)
la source
Absolument. Considérez-le comme un dictionnaire ou un tableau associatif. Vous pouvez y ajouter à tout moment.
la source