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

IT技术 javascript jquery object syntax
2021-01-08 15:53:53

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

6个回答

您可以使用以下等效语法:

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' }

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

var obj = {
  [key]: value
}

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

var obj = {
  ['hello']: 'World',
  [x + 2]: 42,
  [someObject.getId()]: someVar
}
这个问题是关于修改现有对象,而不是创建一个新对象。
2021-02-14 15:53:53
这个特定的问题可能是关于修改的,但它被其他关于动态创建对象的问题所引用,所以我最终来到这里并愉快地从这个答案中受益。
2021-02-28 15:53:53
@ArthurTarasov:ECMAScript 6 更正式地称为 ECMAScript 2015(“ES2015”),又名 ECMAScript 6th edition(“ES6”)。这是 2015 年 6 月发布的 JavaScript 规范。从那时起,我们有了 ES2016,很快我们就会有 ES2017,它们现在处于年度周期。
2021-02-28 15:53:53
我不确定 ECMAScript 6 是什么,但我非常感谢它
2021-03-03 15:53:53
@wOxxOm 哈哈,是的,我为什么要经历那些obj[name]=value我可以只使用您的建议的麻烦
2021-03-08 15:53:53

你甚至可以像这样制作对象列表

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

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

  • 符号: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 的即时古怪不太熟悉。这可能对某些人有用。

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