我使用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”的属性。上面给了我name
。
如何使用JavaScript使用变量命名对象的属性?
答案 0 :(得分:437)
您可以使用以下等效语法:
obj[name] = value
答案 1 :(得分:94)
使用ECMAScript 2015,您可以使用括号表示法直接在对象声明中执行此操作:
var obj = {
[key]: value
}
key
可以是任何类型的表达式(例如变量)返回值:
var obj = {
['hello']: 'World',
[x + 2]: 42,
[someObject.getId()]: someVar
}
答案 2 :(得分:11)
你甚至可以制作像这样的对象列表
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);
});
答案 3 :(得分: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" } } }
答案 4 :(得分:2)
首先,我们需要将键定义为变量,然后我们需要将键分配为对象。例如
var data = {key:'dynamic_key',value:'dynamic_value'}
var key = data.key;
var obj = { [key]: data.value}
console.log(obj)

答案 5 :(得分:2)
访问对象属性有两种不同的符号
点符号快速简便,但必须明确使用实际属性名称。没有替代,变量等。
括号表示法是开放式的。它使用一个字符串,但您可以使用任何合法的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即时的怪癖很不熟悉。这可能对某些人有用。
答案 6 :(得分:1)
随着ES2015 Object.assign和computed property names的出现,OP的代码归结为:
var obj = Object.assign.apply({}, $(itemsFromDom).map((i, el) => ({[el.id]: el.value})));
答案 7 :(得分:1)
ajavascript具有两种用于获取javascript对象属性的注释:
Obj = {};
1)(。)注释,例如对象 仅当对象已经具有名称为'id'的属性时,此方法才有效
2)([])注释,例如。如果对象没有名称为“ id”的任何属性,则将在此处Obj [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;
})
答案 8 :(得分:1)
与主题相关,但并非专门针对jquery。我在ec6 react项目中使用了此功能,也许可以帮助某人:
this.setState({ [`${name}`]: value}, () => {
console.log("State updated: ", JSON.stringify(this.state[name]));
});
PS:请注意引号。
答案 9 :(得分:0)
如果要动态地向对象添加字段,最简单的方法如下:
.load()
这将创建具有以下字段的数据对象:
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
}
答案 10 :(得分:0)
如果有对象,则可以创建键数组,然后进行映射,并根据以前的对象键和值创建新对象。
Object.keys(myObject)
.map(el =>{
const obj = {};
obj[el]=myObject[el].code;
console.log(obj);
});
答案 11 :(得分:-1)
objectname.newProperty = value;
答案 12 :(得分:-1)
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;
}