在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?
15 回答
这就是我解决问题的方法 .
生成以下对象:
我知道这个帖子已经有几个答案了,但我还没有看到一个有多个属性且它们在一个数组中的答案 . 顺便提一下,这个解决方案适用于ES6 .
为了说明,假设我们有一个名为person的数组,其中包含对象:
因此,您可以添加具有相应值的属性 . 假设我们要添加 Language ,默认值为 EN .
Person 数组现在会变成这样:
当然 . 可以将其视为字典或关联数组 . 您可以随时添加它 .
最简单,最便携的方式是 .
基于#abeing的答案!
是 .
ES6获胜!
如果您记录
data
,您会得到:这使用了新的Computed Property语法和Template Literals .
Be careful 使用 .(dot) 方法向现有对象添加属性 .
(.dot) 只有在事先使用 'key' 'key' 否则使用 [bracket] 方法时,才应使用向对象添加属性的方法 .
Example:
注意控制台日志末尾的 problem - 'key: 1999' 而不是 Property6: 6, Property7: 7,.........,Property1999: 1999 . 因此,添加动态创建的属性的最佳方法是[bracket]方法 .
除了之前的所有答案,如果您要使用计算属性名称(ECMAScript 6)在 Future 中编写动态属性名称,请按以下步骤操作:
参考:Understanding ECMAScript 6 - Nickolas Zakas
我知道问题得到了很好的回答,但我也找到了另一种添加新属性的方法,并希望与您分享:
你可以使用函数
Object.defineProperty()
发现于Mozilla Developer Network
例:
只是上述abeing答案的补充 . 您可以定义一个函数来封装defineProperty的复杂性,如下所述 .
参考:http://addyosmani.com/resources/essentialjsdesignpatterns/book/#constructorpatternjavascript
在这里,使用您的符号:
您可以使用以下某些选项动态添加属性:
在你的例子中:
您可以在接下来的两种方式中定义具有动态值的属性:
要么
更多..如果您的密钥也是动态的,您可以使用Object类定义:
其中 data 是您的对象, key 是存储键名称的变量, value 是存储值的变量 .
我希望这有帮助!
您只需使用点表示法即可添加任意数量的属性:
or :
用于动态密钥 .
从包含对象的动态字符串名称访问的好方法(例如object.subobject.property)
例:
eval适用于读取值,但写入值有点困难 .
更高级的版本(如果它们不存在则创建子类,并允许对象而不是全局变量)
例:
这与o.object.subobject.property相同
对的,这是可能的 . 假设:
或者:
要么
第一种方法是优选的 . 如果你使用用户提供的值,eval()有明显的安全问题,所以如果你能避免使用它就不要使用它,但值得知道它存在以及它能做什么 .
您可以参考:
要么
要么