2010-02-11 18 views
238

Quiero añadir una nueva propiedad a 'myObj', el nombre de 'cadena1' y darle un valor de 'cadena2', pero cuando lo hago se vuelve 'no definido:¿Cómo crear una propiedad de objeto a partir de un valor 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 otras palabras: ¿Cómo creo una propiedad de objeto y le doy el nombre almacenado en la variable, pero no el nombre de la variable en sí?

+0

@Bergi, esta pregunta y respuesta no es un duplicado! El otro es JQuery y este es vail js – daniella

+1

@daniella La propiedad del objeto es absolutamente simple javascript. Que se use en un ejemplo de jQuery es irrelevante. – Bergi

Respuesta

331
+8

No son realmente "equivalentes"; 'myObj.a = b' significa algo diferente a' myObj [a] = b' (a menos que 'a ==' a'') pero sea lo que sea ... esto es lo que quieres. –

+13

Lo que quiero decir es que son formas equivalentes de establecer una propiedad. Obviamente, se comportan de manera diferente (de ahí el propósito de publicar esta respuesta), pero tienen el mismo resultado. – philfreo

+4

philfreo: excepto que no tienen el mismo resultado, que es la base de esta pregunta. – bukzor

57

notación de punto y las propiedades son equivalentes. Por lo que sería lograr de este modo:

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

(alertas "lo que sea")

8

Ecu, si lo hace myObj.a, entonces se busca la propiedad llamada a de myObj. Si lo hace myObj[a] =b, entonces busca la propiedad a.valueOf() de myObj.

4

Se podía utilizar esto:

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

Cualquier cosa que pase como primer parámetro será el nombre de la propiedad, y el segundo parámetro es el valor de la propiedad.

6

Oneliner:

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

O:

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

Algo más corto?

+3

No estoy seguro si puedes contar eso como una delineador, ya que la función interna tiene tres afirmaciones, no una (que generalmente es el requisito de ser de una sola línea). –

+0

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

+0

Me gusta la elegancia del segundo fragmento. Tiene sentido porque var hace dos acciones y una de las primeras es que "define" la variable como indefinida. – Trent

172

ES6 introduce los nombres de propiedades calculadas, que le permiten hacer

var myObj = {[a]: b}; 

soporte del navegador Nota es insignificante en la actualidad.

+6

Sin embargo, funciona con Babel. – Zequez

+6

Para aquellos como yo que desarrollamos usando Node.js y necesitamos esto solo para back-end, por lo tanto no nos preocupan las implementaciones del navegador, esto fue MUY útil. Debería tener más votos favorables – lucasnadalutti

+1

Esto realmente parece ser la única forma de crear un objeto anónimo con una variable como clave, muy útil cuando solo tiene que insertarlo en una matriz. – cocheci

1

No se puede usar una variable para acceder a una propiedad a través de la notación de puntos, en su lugar se usa la notación de matriz.

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

Como alcance $ es un objeto, puede probar con JavaScript por:

$scope['something'] = 'hey' 

Es igual a:

$scope.something = 'hey' 

I created a fiddle to test.

0

A continuación se muestra un enfoque alternativo para devolver un objeto de par de claves utilizando el formulario (a, b). El primer ejemplo utiliza la cadena 'key' como nombre de la propiedad y 'val' como valor.

Ejemplo # 1:

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

ejemplo: # 2:

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

Como se muestra en el segundo ejemplo, este puede modificar objetos existentes, también (si la propiedad está ya definido en el objeto, el valor se sobrescribirá).

Resultado # 1:{ key: 'val' }

Resultado # 2:{ foo: 'bar', key: 'val' }

Cuestiones relacionadas