当前位置:  开发笔记 > 编程语言 > 正文

是否可以向JavaScript对象添加动态命名属性?

如何解决《是否可以向JavaScript对象添加动态命名属性?》经验,为你挑选了11个好方法。

在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"]);



1> Georg Schöll..:

是.

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

data["PropertyD"] = 4;

// dialog box with 4 in it
alert(data.PropertyD);
alert(data["PropertyD"]);


2> Mauricio Soa..:

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.


这非常好{... state,[prop]:val}
尚不清楚此代码片段对尚未看到或理解新语法的人正在做什么。我建议进行编辑以显示带有'a'常量的输出/预期属性。

3> cletus..:

对的,这是可能的.假设:

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]);


使用eval真的很危险.
更不用说慢了.

4> artgrohe..:

我知道问题得到了很好的回答,但我也找到了另一种添加新属性的方法,并希望与您分享:

你可以使用这个功能 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


@Trevor:完全可配置性和添加getter和setter的能力; 另外,能够使用[`defineProperties`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)(复数)一次添加多个属性.
这种方法的优缺点是什么?

5> Maxim Sloyko..:

在这里,使用您的符号:

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'



6> Anas Nakawa..:

除了之前的所有答案,如果您想知道我们将如何使用计算属性名称(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



7> Gabriel Hurl..:

您只需使用点表示法即可添加任意数量的属性:

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

或者:

data[newattribute] = somevalue

用于动态键.


如果属性名称直到运行时才确定" - 那么除非你使用eval,否则这将不起作用,这不是一个好的选择

8> Rusty..:

ES6引入了计算属性名称,您可以使用它来执行

let a = 'key'
let myObj = {[a]: 10};
// output will be {key:10}



9> Sarvesh..:

只是上述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



10> Fabricio..:

您可以使用以下某些选项动态添加属性:

在你的例子中:

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

您可以在接下来的两种方式中定义具有动态值的属性:

data.key = value;

要么

data['key'] = value;

更多..如果您的密钥也是动态的,您可以使用Object类定义:

Object.defineProperty(data, key, withValue(value));

其中data是您的对象,key是存储键名的变量,value是存储值的变量.

我希望这有帮助!



11> Edper..:

我知道这个帖子已经有几个答案了,但我还没有看到一个有多个属性并且它们在一个数组中的答案.顺便提一下,这个解决方案适用于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"}]


您说对了,应该是“ Person = Person.map(此处为代码)”。但是关键是您可以使用ES6轻松地向现有对象添加属性。
推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有