我用jQuery将项目从DOM中拉出来,并希望使用DOM元素的id设置对象上的属性。

例子

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”的属性。上面给了我名字。

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


当前回答

javascript有两种类型的注释来获取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;
    })

其他回答

使用ECMAScript 2015,你可以直接在对象声明中使用括号表示:

var obj = {
  [key]: value
}

其中key可以是任何类型的表达式(例如变量),返回一个值:

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

使用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" } } }

你甚至可以像这样创建对象列表

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

随着ES2015 Object的出现。OP的代码可以归结为:

var obj = Object.assign.apply({}, $(itemsFromDom).map((i, el) => ({[el.id]: el.value})));

javascript有两种类型的注释来获取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;
    })