Answers:
是。
var data = {
'PropertyA': 1,
'PropertyB': 2,
'PropertyC': 3
};
data["PropertyD"] = 4;
// dialog box with 4 in it
alert(data.PropertyD);
alert(data["PropertyD"]);
object["property"]
与并不完全相同array[4]
,前者不是作为真正的数组创建的。
data["PropertyD"]
到data[function_to_get_property_name()]
似乎微不足道。
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
}
obj[propname]
)。相反,我可以将其与对象传播语法一起使用。
var a = {}; a["dynamic-" + prop] = true;
a
。(特别是在使用像redux这样的软件包时)
是的,有可能。假设:
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]);
$("#mySelector").data("propertyname", myvalue);
进行设置,并var myValue=$("#mySelector").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
defineProperties
(多个)一次添加多个属性。
Object.defineProperty
并不是简单易用的工具,而是具有细粒度控制的工具。如果您不需要该其他控件,则不是正确的选择工具。
Object.defineProperty(obj, prop, valueDescriptor)
V8的优化比简单进行的慢和困难obj[prop] = value
;
在这里,使用您的符号:
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'
只需使用点符号即可添加任意多的属性:
var data = {
var1:'somevalue'
}
data.newAttribute = 'newvalue'
或:
data[newattribute] = somevalue
用于动态键。
除了前面的所有答案之外,如果您想知道我们将来如何使用计算属性名(ECMAScript 6)编写动态属性名,请执行以下操作:
var person = "John Doe";
var personId = "person_" + new Date().getTime();
var personIndex = {
[ personId ]: person
// ^ computed property name
};
personIndex[ personId ]; // "John Doe"
只是上述安倍答案的补充。您可以定义一个函数来封装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
我知道这篇文章已经有几个答案了,但是我还没有看到其中有多个属性并且它们在一个数组中的答案。顺便说一下,此解决方案适用于ES6。
为了举例说明,假设我们有一个名为person的数组,其中包含对象:
let Person = [{id:1, Name: "John"}, {id:2, Name: "Susan"}, {id:3, Name: "Jet"}]
因此,您可以添加具有相应值的属性。假设我们要添加一种默认值为EN的语言。
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"}]
Person = Person.map(code here)
。但关键是您可以使用轻松将属性添加到现有对象ES6
。
使用。(dot)方法向现有对象添加属性时要小心。
(.dot)向对象添加属性的方法仅应在事先知道'key'的情况下使用,否则请使用[bracket]方法。
例:
var data = {
'Property1': 1
};
// Two methods of adding a new property [ key (Property4), value (4) ] to the
// existing object (data)
data['Property2'] = 2; // bracket method
data.Property3 = 3; // dot method
console.log(data); // { Property1: 1, Property2: 2, Property3: 3 }
// But if 'key' of a property is unknown and will be found / calculated
// dynamically then use only [bracket] method not a dot method
var key;
for(var i = 4; i < 6; ++i) {
key = 'Property' + i; // Key - dynamically calculated
data[key] = i; // CORRECT !!!!
}
console.log(data);
// { Property1: 1, Property2: 2, Property3: 3, Property4: 4, Property5: 5 }
for(var i = 6; i < 2000; ++i) {
key = 'Property' + i; // Key - dynamically calculated
data.key = i; // WRONG !!!!!
}
console.log(data);
// { Property1: 1, Property2: 2, Property3: 3,
// Property4: 4, Property5: 5, key: 1999 }
请注意控制台日志末尾的问题 -'key :1999',而不是Property6:6,Property7:7,.........,Property1999:1999。因此,添加动态创建的属性的最佳方法是[bracket]方法。
一种从包含对象的动态字符串名称访问的好方法(例如object.subobject.property)
function ReadValue(varname)
{
var v=varname.split(".");
var o=window;
if(!v.length)
return undefined;
for(var i=0;i<v.length-1;i++)
o=o[v[i]];
return o[v[v.length-1]];
}
function AssignValue(varname,value)
{
var v=varname.split(".");
var o=window;
if(!v.length)
return;
for(var i=0;i<v.length-1;i++)
o=o[v[i]];
o[v[v.length-1]]=value;
}
例:
ReadValue("object.subobject.property");
WriteValue("object.subobject.property",5);
eval适用于读取值,但是写入值要难一些。
更高级的版本(如果不存在子类,则创建子类,并允许使用对象而不是全局变量)
function ReadValue(varname,o=window)
{
if(typeof(varname)==="undefined" || typeof(o)==="undefined" || o===null)
return undefined;
var v=varname.split(".");
if(!v.length)
return undefined;
for(var i=0;i<v.length-1;i++)
{
if(o[v[i]]===null || typeof(o[v[i]])==="undefined")
o[v[i]]={};
o=o[v[i]];
}
if(typeof(o[v[v.length-1]])==="undefined")
return undefined;
else
return o[v[v.length-1]];
}
function AssignValue(varname,value,o=window)
{
if(typeof(varname)==="undefined" || typeof(o)==="undefined" || o===null)
return;
var v=varname.split(".");
if(!v.length)
return;
for(var i=0;i<v.length-1;i++)
{
if(o[v[i]]===null || typeof(o[v[i]])==="undefined")
o[v[i]]={};
o=o[v[i]];
}
o[v[v.length-1]]=value;
}
例:
ReadValue("object.subobject.property",o);
WriteValue("object.subobject.property",5,o);
这与o.object.subobject.property相同
这是我解决问题的方法。
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
};
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);