2010-02-11 7 views
238

Je veux ajouter une nouvelle propriété à « myObj », nommez « string1 » et lui donner une valeur de « string2 », mais quand je le fais, il retourne « undefined:Comment créer une propriété d'objet à partir d'une valeur de variable en JavaScript?

var myObj = new Object; 
var a = 'string1'; 
var b = 'string2'; 
myObj.a = b; 

alert(myObj.string1); //Returns 'undefined' 
alert(myObj.a); //Returns 'string2' 

En d'autres termes: Comment puis-je créer une propriété d'objet et lui donner le nom stocké dans la variable, mais pas le nom de la variable elle-même?

+0

@Bergi, cette question et réponse est pas un doublon! L'autre est JQuery et celui-ci est vanilla js – daniella

+1

@daniella La propriété d'objet est absolument javascript. Le fait qu'il soit utilisé dans un exemple jQuery n'est pas pertinent. – Bergi

Répondre

331
+8

Ils ne sont pas vraiment "équivalents"; 'myObj.a = b' signifie quelque chose de différent de' myObj [a] = b' (sauf 'a == 'a'') mais peu importe ... c'est ce que vous voulez. –

+13

Ce que je voulais dire, c'est qu'ils sont des moyens équivalents de définir une propriété. Évidemment, ils se comportent différemment (d'où le but de poster cette réponse) - mais ils ont le même résultat. – philfreo

+4

philfreo: sauf qu'ils n'ont pas le même résultat, ce qui est la base de cette question. – bukzor

57

notation Dot et les propriétés sont équivalentes. Donc, vous accomplir comme ceci:

var myObj = new Object; 
var a = 'string1'; 
myObj[a] = 'whatever'; 
alert(myObj.string1) 

(alertes "whatever")

8

Ecu, si vous le faites myObj.a, il recherche la propriété nommée un des myObj. Si vous faites myObj[a] =b alors il cherche la propriété a.valueOf() de myObj.

4

Vous pouvez simplement utiliser ceci:

function createObject(propName, propValue){ 
    this[propName] = propValue; 
} 
var myObj1 = new createObject('string1','string2'); 

Tout ce que vous passez comme premier paramètre sera le nom de la propriété, et le second paramètre est la valeur de la propriété.

6

Oneliner:

obj = (function(attr, val){ var a = {}; a[attr]=val; return a; })('hash', 5); 

Ou:

attr = 'hash'; 
val = 5; 
var obj = (obj={}, obj[attr]=val, obj); 

Quelque chose de plus court?

+3

Je ne suis pas sûr si vous pouvez compter cela comme un- doublure, comme la fonction à l'intérieur a trois déclarations, pas un (qui est habituellement l'exigence d'être un seul doublure). –

+0

http://en.wikipedia.org/wiki/One-liner_program – user2846569

+0

J'aime l'élégance du deuxième extrait. Cela a du sens parce que var fait deux actions et l'une des premières est qu'elle "définit" la variable comme non définie. – Trent

172

ES6 présente les noms de propriétés calculées, qui vous permettent de faire

var myObj = {[a]: b}; 

support du navigateur Remarque est actuellement négligeable.

+6

Fonctionne avec Babel si. – Zequez

+6

Pour ceux qui, comme moi, développent en utilisant Node.js et n'en ont besoin que pour le backend, ne s'inquiétant donc pas des implémentations du navigateur, c'était TRÈS utile. Devrait avoir plus de votes upvotes! – lucasnadalutti

+1

Cela ressemble en fait à la seule façon de créer un objet anonyme avec une variable en tant que clé, très utile lorsque vous avez juste besoin de pousser ceci sur un tableau. – cocheci

1

Vous ne pouvez pas utiliser une variable pour accéder à une propriété via la notation par points. Utilisez plutôt la notation de tableau.

var obj= { 
    'name' : 'jroi' 
}; 
var a = 'name'; 
alert(obj.a); //will not work 
alert(obj[a]); //should work and alert jroi' 
4

Comme la portée de $ est un objet, vous pouvez essayer avec JavaScript par:

$scope['something'] = 'hey' 

Il est égal à:

$scope.something = 'hey' 

I created a fiddle to test.

0

Voici une approche alternative pour renvoyer un objet paire de clés en utilisant la forme (a, b). Le premier exemple utilise la chaîne 'key' comme nom de propriété et 'val' comme valeur.

Exemple # 1:

(function(o,a,b){return o[a]=b,o})({},'key','val'); 

Exemple: # 2:

var obj = { foo: 'bar' }; 
(function(o,a,b){return o[a]=b,o})(obj,'key','val'); 

Comme le montre le deuxième exemple, cela peut modifier des objets existants, trop (si la propriété est déjà défini dans l'objet, la valeur sera écrasée).

Résultat # 1:{ key: 'val' }

Résultat # 2:{ foo: 'bar', key: 'val' }

Questions connexes