在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?
Georg Schöll.. 1135
是.
var data = {
'PropertyA': 1,
'PropertyB': 2,
'PropertyC': 3
};
data["PropertyD"] = 4;
// dialog box with 4 in it
alert(data.PropertyD);
alert(data["PropertyD"]);
是.
var data = {
'PropertyA': 1,
'PropertyB': 2,
'PropertyC': 3
};
data["PropertyD"] = 4;
// dialog box with 4 in it
alert(data.PropertyD);
alert(data["PropertyD"]);
ES6获胜!
const b = 'b'; const c = 'c'; const data = { a: true, [b]: true, // dynamic property [`interpolated-${c}`]: true, // dynamic property + interpolation [`${b}-${c}`]: true }
如果你记录data
你得到这个:
{ a: true, b: true, interpolated-c: true, b-c: true }
这使用了新的Computed Property语法和Template Literals.
对的,这是可能的.假设:
var data = { 'PropertyA': 1, 'PropertyB': 2, 'PropertyC': 3 }; var propertyName = "someProperty"; var propertyValue = "someValue";
或者:
data[propertyName] = propertyValue;
要么
eval("data." + propertyName + " = '" + propertyValue + "'");
第一种方法是优选的.如果您使用用户提供的值,eval()有明显的安全问题,所以如果您可以避免使用它,请不要使用它,但值得知道它存在以及它可以做什么.
您可以参考:
alert(data.someProperty);
要么
data(data["someProperty"]);
要么
alert(data[propertyName]);
我知道问题得到了很好的回答,但我也找到了另一种添加新属性的方法,并希望与您分享:
你可以使用这个功能 Object.defineProperty()
在Mozilla开发者网络上找到
例:
var o = {}; // Creates a new object // Example of an object property added with defineProperty with a data property descriptor Object.defineProperty(o, "a", {value : 37, writable : true, enumerable : true, configurable : true}); // 'a' property exists in the o object and its value is 37 // Example of an object property added with defineProperty with an accessor property descriptor var bValue; Object.defineProperty(o, "b", {get : function(){ return bValue; }, set : function(newValue){ bValue = newValue; }, enumerable : true, configurable : true}); o.b = 38; // 'b' property exists in the o object and its value is 38 // The value of o.b is now always identical to bValue, unless o.b is redefined // You cannot try to mix both : Object.defineProperty(o, "conflict", { value: 0x9f91102, get: function() { return 0xdeadbeef; } }); // throws a TypeError: value appears only in data descriptors, get appears only in accessor descriptors
在这里,使用您的符号:
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? data[propName] = 'Some New Property value'
除了之前的所有答案,如果您想知道我们将如何使用计算属性名称(ECMAScript 6)在Future中编写动态属性名称,请按以下步骤操作:
var person = "John Doe"; var personId = "person_" + new Date().getTime(); var personIndex = { [ personId ]: person // ^ computed property name }; personIndex[ personId ]; // "John Doe"
参考:了解ECMAScript 6 - Nickolas Zakas
您只需使用点表示法即可添加任意数量的属性:
var data = { var1:'somevalue' } data.newAttribute = 'newvalue'
或者:
data[newattribute] = somevalue
用于动态键.
ES6引入了计算属性名称,您可以使用它来执行
let a = 'key' let myObj = {[a]: 10}; // output will be {key:10}
只是上述abeing答案的补充.您可以定义一个函数来封装defineProperty的复杂性,如下所述.
var defineProp = function ( obj, key, value ){ var config = { value: value, writable: true, enumerable: true, configurable: true }; Object.defineProperty( obj, key, config ); }; //Call the method to add properties to any object defineProp( data, "PropertyA", 1 ); defineProp( data, "PropertyB", 2 ); defineProp( data, "PropertyC", 3 );
参考:http://addyosmani.com/resources/essentialjsdesignpatterns/book/#constructorpatternjavascript
您可以使用以下某些选项动态添加属性:
在你的例子中:
var data = { 'PropertyA': 1, 'PropertyB': 2, 'PropertyC': 3 };
您可以在接下来的两种方式中定义具有动态值的属性:
data.key = value;
要么
data['key'] = value;
更多..如果您的密钥也是动态的,您可以使用Object类定义:
Object.defineProperty(data, key, withValue(value));
其中data是您的对象,key是存储键名的变量,value是存储值的变量.
我希望这有帮助!
我知道这个帖子已经有几个答案了,但我还没有看到一个有多个属性并且它们在一个数组中的答案.顺便提一下,这个解决方案适用于ES6.
为了说明,假设我们有一个名为person的数组,其中包含对象:
let Person = [{id:1, Name: "John"}, {id:2, Name: "Susan"}, {id:3, Name: "Jet"}]
因此,您可以添加具有相应值的属性.假设我们想要添加一个默认值为EN的语言.
Person.map((obj)=>({...obj,['Language']:"EN"}))
该人士阵列现在会变成这个样子:
Person = [{id:1, Name: "John", Language:"EN"}, {id:2, Name: "Susan", Language:"EN"}, {id:3, Name: "Jet", Language:"EN"}]