使用变量作为名称向JavaScript对象添加属性?


277

我正在使用jQuery从DOM中提取项目,并希望使用idDOM元素的对象设置属性。

const obj = {}

jQuery(itemsFromDom).each(function() {
  const element = jQuery(this)
  const name = element.attr('id')
  const value = element.attr('value')

  // Here is the problem
  obj.name = value
})

如果itemsFromDom包含一个元素id为“ myId” 的元素,我想obj拥有一个名为“ myId”的属性。以上给了我name

如何使用JavaScript使用变量来命名对象的属性?



Answers:



122

使用ECMAScript 2015,您可以使用括号表示法直接在对象声明中执行此操作:

var obj = {
  [key]: value
}

在哪里key可以有返回值的任何形式的表达式(例如变量):

var obj = {
  ['hello']: 'World',
  [x + 2]: 42,
  [someObject.getId()]: someVar
}

13
这个问题是关于修改现有对象,而不是创建一个新对象。
米哈尔Perłakowski

28
这个特定的问题可能与修改有关,但是其他与动态创建对象有关的问题也引用了这个问题,因此我在这里结束了,很高兴从此答案中受益。
奥利弗·劳埃德

2
@wOxxOm大声笑是的,我为什么要麻烦obj[name]=value我何时只能使用您的建议
chiliNUT

2
我不确定ECMAScript 6是什么,但是我非常感谢
Arthur Tarasov

2
@ArthurTarasov:ECMAScript 6更正式地称为ECMAScript 2015(“ ES2015”),也称为ECMAScript 6th Edition(“ ES6”)。这是2015年6月发布的JavaScript规范。从那时起,我们有了ES2016,很快我们将拥有ES2017,它们现在处于每年周期。
TJ Crowder

12

您甚至可以制作这样的对象列表

var feeTypeList = [];
$('#feeTypeTable > tbody > tr').each(function (i, el) {
    var feeType = {};

    var $ID = $(this).find("input[id^=txtFeeType]").attr('id');

    feeType["feeTypeID"] = $('#ddlTerm').val();
    feeType["feeTypeName"] = $('#ddlProgram').val();
    feeType["feeTypeDescription"] = $('#ddlBatch').val();

    feeTypeList.push(feeType);
});

6

访问对象属性有两种不同的表示法

  • 表示法:myObj.prop1
  • 方括号表示法:myObj [“ prop1”]

点表示法快速简便,但是您必须显式使用实际的属性名称。没有替代,变量等。

括号符号是开放式的。它使用一个字符串,但是您可以使用任何合法的js代码生成该字符串。您可以将字符串指定为文字字符串(尽管在这种情况下,点符号会更容易阅读)或使用变量或以某种方式进行计算。

因此,所有这些都将名为prop1myObj属性设置为值Hello

// quick easy-on-the-eye dot notation
myObj.prop1 = "Hello";

// brackets+literal
myObj["prop1"] = "Hello";

// using a variable
var x = "prop1"; 
myObj[x] = "Hello";                     

// calculate the accessor string in some weird way
var numList = [0,1,2];
myObj[ "prop" + numList[1] ] = "Hello";     

陷阱:

myObj.[xxxx] = "Hello";      // wrong: mixed notations, syntax fail
myObj[prop1] = "Hello";      // wrong: this expects a variable called prop1

tl; dnr:如果要计算或引用密钥,则必须使用方括号表示法。如果您明确使用密钥,则对简单的清晰代码使用点表示法

注意:还有其他一些好的和正确的答案,但是我个人发现它们有点简短,这是由于对JS即时的古怪性的不熟悉。这对某些人可能有用。


3

使用lodash,您可以创建_.set这样的新对象:

obj = _.set({}, key, val);

或者您可以像这样设置现有对象:

var existingObj = { a: 1 };
_.set(existingObj, 'a', 5); // existingObj will be: { a: 5 }

如果要在路径中使用点(“。”),则应格外小心,因为lodash可以设置层次结构,例如:

_.set({}, "a.b.c", "d"); // { "a": { "b": { "c": "d" } } }

2

首先,我们需要将键定义为变量,然后将键分配为对象。

var data = {key:'dynamic_key',value:'dynamic_value'}
var key = data.key;
var obj = { [key]: data.value}
console.log(obj)



0

如果要向对象动态添加字段,则最简单的方法如下:

 var params= [
{key: "k1", value=1},
{key: "k2", value=2},
{key: "k3", value=3}];

for(i=0; i< params.len; i++) {
  data[params[i].key] = params[i].value
}

这将创建具有以下字段的数据对象:

{k1:1, k2:2, k3:3}

0

如果有对象,则可以创建键数组,然后进行映射,并根据以前的对象键和值创建新对象。

Object.keys(myObject)
.map(el =>{
 const obj = {};
 obj[el]=myObject[el].code;
 console.log(obj);
});

0

ajavascript具有两种用于获取javascript对象属性的注释:

Obj = {};

1)(。)注释,例如 Obj.id,仅当对象已经具有名称为“ id”的属性时,此方法才有效

2)([])注解,例如。Obj [id]如果对象没有名称为“ id”的属性,它将创建一个名称为“ id”的新属性。

所以下面的例子:

当您写入Obj [name]时,将始终创建一个新属性。如果该属性已经存在且具有相同的名称,它将覆盖它。

const obj = {}
    jQuery(itemsFromDom).each(function() {
      const element = jQuery(this)
      const name = element.attr('id')
      const value = element.attr('value')
      // This will work
      obj[name]= value;
    })

0

与主题相关,但不是专门针对jquery。我在ec6 react项目中使用了它,也许可以帮助某人:

this.setState({ [`${name}`]: value}, () => {
      console.log("State updated: ", JSON.stringify(this.state[name]));
    });

PS:请注意引号字符。



-2
const data = [{
    name: 'BMW',
    value: '25641'
  }, {
    name: 'Apple',
    value: '45876'
  },
  {
    name: 'Benz',
    value: '65784'
  },
  {
    name: 'Toyota',
    value: '254'
  }
]

const obj = {
  carsList: [{
    name: 'Ford',
    value: '47563'
  }, {
    name: 'Toyota',
    value: '254'
  }],
  pastriesList: [],
  fruitsList: [{
    name: 'Apple',
    value: '45876'
  }, {
    name: 'Pineapple',
    value: '84523'
  }]
}

let keys = Object.keys(obj);

result = {};

for(key of keys){
    let a =  [...data,...obj[key]];
    result[key] = a;

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.