在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 obj = {
};
var field = "someouter.someinner.someValue";
var value = 123;
function _addField( obj, field, value )
{
// split the field into tokens
var tokens = field.split( '.' );
// if there's more than one token, this field is an object
if( tokens.length > 1 )
{
var subObj = tokens[0];
// define the object
if( obj[ subObj ] !== undefined ) obj[ subObj ] = {};
// call addfield again on the embedded object
var firstDot = field.indexOf( '.' );
_addField( obj[ subObj ], field.substr( firstDot + 1 ), value );
}
else
{
// no embedded objects, just field assignment
obj[ field ] = value;
}
}
_addField( obj, field, value );
_addField(obj, 'simpleString', 'string');
console.log( JSON.stringify( obj, null, 2 ) );
生成以下对象:
{
"someouter": {
"someinner": {
"someValue": 123
}
},
"simpleString": "string"
}
您可以使用下面的一些选项动态添加属性:
在你的例子中:
var data = {
'PropertyA': 1,
'PropertyB': 2,
'PropertyC': 3
};
你可以用下面两种方式定义一个带有动态值的属性:
data.key = value;
or
data['key'] = value;
甚至,如果你的键也是动态的,你可以使用Object类定义:
Object.defineProperty(data, key, withValue(value));
其中data是对象,key是存储键名的变量,value是存储值的变量。
我希望这能有所帮助!
是的,这是可能的。假设:
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]);
ES6为胜利而战!
const b = 'B';
const c = 'C';
const data = {
a: true,
[b]: true, // dynamic property
[`interpolated-${c}`]: true, // dynamic property + interpolation
[`${b}-${c}`]: true
}
如果你记录数据,你会得到这个:
{
a: true,
B: true,
interpolated-C: true,
B-C: true
}
这使用了新的计算属性语法和模板字面量。