使用属性名称的变量创建对象

IT技术 javascript properties object-literal
2021-01-30 06:34:23

是否可以在对象文字属性中使用变量名来创建对象?

例子

function createJSON (propertyName){
    return { propertyName : "Value"};
}

var myObject = createJSON("myProperty");

console.log(myObject.propertyName);  // Prints "value"
console.log(myObject.myProperty);  // This property does not exist
4个回答

如果要为属性名称使用变量,可以使用Computed Property Names将变量名放在方括号之间:

var foo = "bar";
var ob  = { [foo]: "something" }; // ob.bar === "something"

如果您想要 Internet Explorer 支持,您将需要使用 ES5 方法(您可以通过编写现代语法(如上)然后应用Babel 来获得):

首先创建对象,然后使用方括号表示法添加属性

var foo = "bar";
var ob  = {};
ob[foo] = "something"; // === ob.bar = "something"

如果您想以编程方式创建 JSON,则必须将对象序列化为符合 JSON 格式的字符串。例如,用JSON.stringify方法

ES6 引入了计算属性名称,它允许你做

function CreateJSON (propertyName){
    var myObject = { [propertyName] : "Value"};
}

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

当我写答案时,只有 Firefox Nigthly。根据MDN,现在 Firefox 34+ 和 Safari 7.1.3+
2021-03-30 06:34:23
截至 2020 年,除 IE 外,所有浏览器现在都支持计算属性名称。
2021-03-31 06:34:23
这对我来说是最好的答案。我正在使用 nodejs。
2021-04-04 06:34:23
有趣的是,浏览器支持的任何更新?
2021-04-11 06:34:23

你可以这样做:

  var myObject = {};
  CreateProp("myProperty","MyValue");

  function CreateProp(propertyName, propertyValue)
  {
      myObject[propertyName] = propertyValue;
      alert(myObject[propertyName]);  // prints "MyValue" 
  };

不过,我自己更喜欢这种语法:

function jsonObject()
{
};
var myNoteObject = new jsonObject();

function SaveJsonObject()
{
    myNoteObject.Control = new jsonObject();
    myNoteObject.Control.Field1= "Fred";
    myNoteObject.Control.Field2= "Wilma";
    myNoteObject.Control.Field3= "Flintstone";
    myNoteObject.Control.Id= "1234";
    myNoteObject.Other= new jsonObject();
    myNoteObject.Other.One="myone";
};

然后您可以使用以下内容:

SaveJsonObject();
var myNoteJSON = JSON.stringify(myNoteObject);

注意:这里使用了 json2.js:http : //www.json.org/js.html

可能合适的一件事(现在 JSON 功能对于较新的浏览器很常见,并且 json2.js 是一个完全有效的后备),是构造一个 JSON 字符串然后解析它。

function func(prop, val) {
    var jsonStr = '{"'+prop+'":'+val+'}';
    return JSON.parse(jsonStr);
}

var testa = func("init", 1);
console.log(testa.init);//1

请记住,JSON 属性名称需要用双引号括起来。