在JavaScript中,我创建了一个这样的对象:

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};

如果直到运行时才确定属性名称,那么是否可以在初始创建该对象后向其添加更多属性?即。

var propName = 'Property' + someUserInput
//imagine someUserInput was 'Z', how can I now add a 'PropertyZ' property to 
//my object?

当前回答

你可以添加更多的属性,只要你喜欢使用点符号:

var data = {
    var1:'somevalue'
}
data.newAttribute = 'newvalue'

or:

data[newattribute] = somevalue

对于动态键。

其他回答

一个完美简单的方法

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};

var newProperty = 'getThisFromUser';
data[newProperty] = 4;

console.log(data);

如果您想将它应用于数据数组(ES6/TS版本)

const data = [
  { 'PropertyA': 1, 'PropertyB': 2, 'PropertyC': 3 },
  { 'PropertyA': 11, 'PropertyB': 22, 'PropertyC': 33 }
];

const newProperty = 'getThisFromUser';
data.map( (d) => d[newProperty] = 4 );

console.log(data);

我正在寻找一个解决方案,我可以在对象声明中使用动态键名(不使用ES6功能,如…或[key]: value)

这是我想到的:

var obj = (obj = {}, obj[field] = 123, obj)

一开始看起来有点复杂,但其实很简单。我们使用逗号操作符在一行中运行三个命令:

Obj ={}:创建一个新对象并将其赋值给变量Obj Obj [field] = 123:向Obj添加计算属性名 Obj:使用Obj变量作为括号/逗号列表的结果

这种语法可以在函数形参中使用,而不需要显式声明obj变量:

//查看结果的test函数。 函数showObject(obj) { console.log (obj); } //动态字段名。 var field = "myDynamicField"; //调用动态对象的函数。 showObject((obj = {}, obj[field] = 123, obj)); / * 输出: { “myDynamicField”:真的 } * /

一些变化

“严格模式”解决方案:

上面的代码不能在严格模式下工作,因为没有声明变量“obj”。

// This gives the same result, but declares the global variable `this.obj`!
showObject( (this.obj = {}, obj[field] = 123, obj) );

在初始化器中使用计算属性名的ES2015代码:

// Works in most browsers, same result as the other functions.
showObject( {[field] = 123} );

这个解决方案适用于所有现代浏览器(但不适用于IE,如果我需要提及的话)

使用JSON.parse()的超级hack方式:

// Create a JSON string that is parsed instantly. Not recommended in most cases.
showObject( JSON.parse( '{"' + field +'":123}') );
// read: showObject( JSON.parse( '{"myDynamicfield":123}') );

键中允许有特殊字符

注意,还可以在计算属性名中使用空格和其他特殊字符(在JSON.parse中也是如此)。

var field = 'my dynamic field :)';
showObject( {[field] = 123} );
// result: { "my dynamic field :)": 123 }

这些字段不能使用点(obj.)访问。My dynamic field:)显然在语法上是无效的),但只能通过括号符号,即obj[' My dynamic field:)']返回123

我知道这篇文章已经有几个答案,但我还没有看到其中有多个属性,它们在一个数组中。顺便说一下,这个解决方案是针对ES6的。

举例来说,假设我们有一个名为person的数组,其中包含对象:

 let Person = [{id:1, Name: "John"}, {id:2, Name: "Susan"}, {id:3, Name: "Jet"}]

因此,您可以添加具有相应值的属性。假设我们想要添加一个默认值为EN的Language。

Person.map((obj)=>({...obj,['Language']:"EN"}))

Person数组现在会变成这样:

Person = [{id:1, Name: "John", Language:"EN"}, 
{id:2, Name: "Susan", Language:"EN"}, {id:3, Name: "Jet", Language:"EN"}]

Yes.

Var数据= { “PropertyA”:1、 “PropertyB”:2 “PropertyC”:3 }; data["PropertyD"] = 4; //对话框中包含4 警报(data.PropertyD); 警报(数据(“PropertyD”));

是的,这是可能的。假设:

var data = {
    'PropertyA': 1,
    'PropertyB': 2,
    'PropertyC': 3
};
var propertyName = "someProperty";
var propertyValue = "someValue";

:

data[propertyName] = propertyValue;

or

eval("data." + propertyName + " = '" + propertyValue + "'");

首选第一种方法。如果使用用户提供的值,Eval()有明显的安全问题,所以如果可以避免,就不要使用它,但知道它的存在以及它能做什么是值得的。

你可以参考:

alert(data.someProperty);

or

data(data["someProperty"]);

or

alert(data[propertyName]);