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

Add a property to a JavaScript object using a variable as the name?

提问人:Todd R 提问时间:3/30/2009 最后编辑:KARTHIKEYAN.ATodd R 更新时间:5/29/2023 访问量:386349

问:

我正在使用 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
})

如果包含一个带有“myId”的元素,我希望有一个名为“myId”的属性。以上给了我.itemsFromDomidobjname

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

JavaScript jQuery 对象 语法

评论

0赞 Bergi 11/18/2014
另请参阅属性访问:点表示法与括号?使用变量动态访问对象属性
0赞 Bergi 8/19/2015
参见 如何在 JavaScript 中从变量值创建对象属性?
0赞 Sebastian Simon 5/29/2023
我曾经将这个问题作为 How to use a variable for a key in a JavaScript object literal?,然后这个目标被错误地替换访问具有动态计算名称的对象属性。现在它被重新开放了——这很奇怪,也很不幸。我原来的重复目标至少应该在这里提到。

答:

553赞 Christian C. Salvadó 3/30/2009 #1

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

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

评论

3赞 Pixelsmith 2/10/2022
这个语法有名字吗?或者我可以阅读更多内容的链接?
1赞 Sebastian Simon 10/27/2022
以下是有关如何访问属性以及如何创建对象的文档。
3赞 luissquall 11/23/2022
@Pixelsmith它们被称为计算属性名称。
12赞 dnxit 2/14/2014 #2

您甚至可以创建这样的对象列表

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);
});
151赞 kube 6/24/2015 #3

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

var obj = {
  [key]: value
}

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

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

评论

15赞 Michał Perłakowski 12/26/2015
这个问题是关于修改现有对象,而不是创建一个新对象。
35赞 Oliver Lloyd 10/30/2016
这个特定的问题可能与修改有关,但它被其他关于动态创建对象的问题所引用,所以我最终来到了这里,并很高兴地从这个答案中受益。
2赞 chiliNUT 3/18/2017
@wOxxOm哈哈,是的,我为什么要经历何时可以使用您的建议的麻烦obj[name]=value
2赞 Arthur Tarasov 4/10/2017
我不确定 ECMAScript 6 是什么,但我非常感谢它
2赞 T.J. Crowder 4/19/2017
@ArthurTarasov:ECMAScript 6 更正式地称为 ECMAScript 2015(“ES2015”),又名 ECMAScript 第 6 版(“ES6”)。它是 2015 年 6 月发布的 JavaScript 规范。从那时起,我们有了ES2016,很快我们将有ES2017,它们现在每年都有一次。
3赞 Momos Morbias 12/15/2016 #4

使用 lodash,您可以创建如下新对象 _.set

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

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

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

如果你想在路径中使用 dot (“.”),你应该小心,因为 lodash 可以设置层次结构,例如:

_.set({}, "a.b.c", "d"); // { "a": { "b": { "c": "d" } } }
1赞 wOxxOm 3/6/2017 #5

随着 ES2015 Object.assign计算属性名称的出现,OP 的代码可以归结为:

var obj = Object.assign.apply({}, $(itemsFromDom).map((i, el) => ({[el.id]: el.value})));
-2赞 ARNAB 5/29/2017 #6

objectname.newProperty = value;

1赞 Sruthi Poddutur 8/10/2017 #7

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

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

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

console.log(data); // -> { k1: 1, k2: 2, k3: 3 }
3赞 KARTHIKEYAN.A 10/25/2017 #8

首先,我们需要将 key 定义为变量,然后我们需要将 key 赋值为 object.,例如

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

6赞 JimB2 5/10/2018 #9

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

  • 表示法: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赞 Shubham Asolkar 11/29/2018 #10
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;

}
0赞 Davit Mkrtchyan 8/16/2019 #11

如果你有对象,你可以创建键数组,而不是映射,并从以前的对象键和值创建新对象。

Object.keys(myObject)
.map(el =>{
 const obj = {};
 obj[el]=myObject[el].code;
 console.log(obj);
});
1赞 Priyanka Jain 1/29/2020 #12

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;
    })
2赞 javatar 2/8/2020 #13

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

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

PS:请注意引号字符。

评论

0赞 Madbreaks 9/24/2020
根据上面的答案,${name} 可以简单地是 .模板文本是不必要的。{ []: value}{ [name]: value}