Добавить свойство к объекту JavaScript, используя переменную в качестве имени?

я вытаскиваю элементы из DOM с помощью jQuery и хочу установить свойство на объекте, используя id элемента DOM.

пример

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", я хочу!--4--> иметь свойство с именем "myId". Это дает мне name.

как назвать свойство объекта с помощью переменной с помощью JavaScript?

10 ответов


вы можете использовать этот эквивалентный синтаксис:

obj[name] = value

С ECMAScript 2015 вы можете сделать это непосредственно в объявлении объекта через квадратные скобки:

var obj = {
  [key]: value
}

здесь key может быть любым выражением (например, переменной), возвращающим значение:

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

вы даже можете сделать список объектов такой

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

Сначала нам нужно определить ключ как переменную, а затем нам нужно назначить ключ как объект., например

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

С lodash, вы можете создать новый объект, как это _.set:

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

или вы можете установить существующий объект следующим образом:

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

вы должны заботиться, если вы хотите использовать точку (".") на вашем пути, потому что лодаш может установить иерархию, например:

_.set({}, "a.b.c", "d"); // { "a": { "b": { "c": "d" } } }

существует два различных обозначения для доступа к свойствам объекта

  • точка Примечание: myObj.которых prop1
  • кронштейн Примечание: myObj ["prop1"]

точка обозначения быстро и легко, но вы должны используйте фактическое имя свойства явно. Нет подстановки, переменных и т. д.

скобочная нотация открытые. Он использует строку, но вы можете создать строка, использующая любой законный код js. Вы можете указать строку как литерал (хотя в этом случае точечная нотация будет читаться проще) или использовать переменную или вычислять каким-либо образом.

Итак, все это установило myObj свойство с именем которых prop1 стоимостью Привет:

// 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 на лету. Это может быть полезно некоторым людям.


С появлением ES2015


objectname.newProperty = value;


Если вы хотите добавить поля в объект динамически, самый простой способ сделать это следующим образом:

 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
}

это создаст объект данных, который имеет следующие поля:

{k1:1, k2:2, k3:3}

на основе wOxxOm это ответ, это пример использования:

const data = [
    {"id": "z1", "val":10},
    {"id": "z2", "val":20},
    {"id": "z3", "val":30}
];
    
const obj = Object.assign.apply({}, data.map((el, i) => ({[el.id]: el.val})));

console.log(obj);