我用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使用变量命名对象的属性?


当前回答

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

点符号:myObj.prop1 括号:myObj["prop1"]

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

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

因此,这些都将名为prop1的myObj属性的值设置为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的熟悉程度不高。这可能对一些人有用。

其他回答

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;

}

你可以使用这个等价的语法:

obj[name] = value

例子:

let obj = {};
obj["the_key"] = "the_value";

或带有ES6功能:

let key = "the_key";
let obj = {
  [key]: "the_value",
};

在这两个例子中,console.log(obj)将返回:{the_key: 'the_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;
    })

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

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

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

var obj = {
  [key]: value
}

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

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