如何在JavaScript中从变量值创建对象属性?

ecu*_*ecu 326 javascript properties object

我想为'myObj'添加一个新属性,将其命名为'string1'并赋予它'string2'的值,但是当我这样做时它会返回'undefined:

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

alert(myObj.string1); //Returns 'undefined'
alert(myObj.a); //Returns 'string2'
Run Code Online (Sandbox Code Playgroud)

换句话说:如何创建一个对象属性并为其赋予存储在变量中的名称,而不是变量本身的名称?

phi*_*reo 426

还有点符号和括号标记

myObj[a] = b;
Run Code Online (Sandbox Code Playgroud)

  • 我只是说有两种设置对象的方法,一种用于密钥是硬编码的,另一种是在变量时.无论你使用`myObj ['foo'] ='bar'`还是`myObj.foo ='bar',我的意思是对象的结果都是等价的. (22认同)
  • 我的意思是它们是设置财产的等效方式.显然他们的行为不同(因此发布这个答案的目的) - 但他们有相同的结果. (14认同)
  • 他们并不是真正的"等同"; `myObj.a = b`意味着与'myObj [a] = b`不同的东西(除非`a =='a'`),但无论如何......这就是你想要的. (11认同)
  • philfreo:除了他们_don't_具有相同的结果,这是这个问题的基础. (5认同)
  • 不知何故,这个方法给了我一个数组 `[a:b]` 而不是 `{a:b}` (2认同)

Ori*_*iol 326

ES6引入了计算属性名称,允许您这样做

var myObj = {[a]: b};
Run Code Online (Sandbox Code Playgroud)

注意浏览器支持目前可以忽略不计.

  • 对于像我这样使用Node.js开发并且只需要后端的人,因此不担心浏览器实现,这非常有用.应该有更多的赞成! (15认同)
  • 但是与Babel合作. (14认同)
  • @Jessica https://kangax.github.io/compat-table/es6/#test-object_literal_extensions_computed_properties (5认同)
  • 这实际上看起来像是创建以变量为键的匿名对象的唯一方法,当您只需要将其推送到数组时非常有用。 (2认同)
  • 目前支持哪些浏览器? (2认同)

cgp*_*cgp 75

点符号和属性是等价的.所以你会这样完成:

var myObj = new Object;
var a = 'string1';
myObj[a] = 'whatever';
alert(myObj.string1)
Run Code Online (Sandbox Code Playgroud)

(警告"无论什么")


use*_*806 9

Ecu,如果你这样做myObj.a,那么它会查找名为myObj的属性.如果你这样做,myObj[a] =b它会查找a.valueOf()myObj 的属性.


use*_*569 7

Oneliner:

obj = (function(attr, val){ var a = {}; a[attr]=val; return a; })('hash', 5);
Run Code Online (Sandbox Code Playgroud)

要么:

attr = 'hash';
val = 5;
var obj = (obj={}, obj[attr]=val, obj);
Run Code Online (Sandbox Code Playgroud)

还有什么更短的?

  • 我不确定你是否可以把它算作一个单行,因为里面的函数有三个语句,而不是一个(通常是单行的要求). (3认同)

Aar*_*rge 5

你可以用这个:

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

作为第一个参数传递的任何内容都将是属性名称,第二个参数是属性值。


jro*_*web 5

您不能使用变量通过点表示法访问属性,而是使用数组表示法。

var obj= {
     'name' : 'jroi'
};
var a = 'name';
alert(obj.a); //will not work
alert(obj[a]); //should work and alert jroi'
Run Code Online (Sandbox Code Playgroud)