Додати властивість до об’єкта JavaScript, використовуючи змінну як ім'я?


277

Я витягаю елементи з 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", я хочу objмати властивість під назвою "myId". Сказане мені даєname .

Як я можу назвати властивість об'єкта за допомогою змінної за допомогою JavaScript?



Відповіді:


469

Ви можете використовувати цей еквівалентний синтаксис:

obj[name] = value

122

З ECMAScript 2015 ви можете це зробити безпосередньо в оголошенні об'єкта, використовуючи позначення дужок:

var obj = {
  [key]: value
}

Де keyможе бути будь-який вираз (наприклад, змінна), що повертає значення:

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

13
Це питання стосується зміни існуючого об'єкта, а не створення нового.
Michał Perłakowski

28
Це конкретне запитання може стосуватися модифікації, але на нього посилаються інші питання, що стосуються динамічного створення об'єктів, і тому я опинився тут і із задоволенням скористався цією відповіддю.
Олівер Ллойд

2
@wOxxOm хай так, чому б я пережив клопоти, obj[name]=valueколи я міг просто використати вашу пропозицію замість цього
chiliNUT

2
Я не впевнений, що таке ECMAScript 6, але я дуже ціную це
Артур Тарасов

2
@ArthurTarasov: ECMAScript 6 більш офіційно називається ECMAScript 2015 ("ES2015") aka ECMAScript 6-е видання ("ES6"). Це специфікація JavaScript, випущена в червні 2015 року. Відтоді у нас з'явився ES2016, і незабаром з'явиться ES2017, вони зараз на щорічному циклі.
TJ Crowder

12

Ви навіть можете скласти список таких об’єктів

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

6

Існують дві різні позначення для доступу до властивостей об'єкта

  • Dot позначення: myObj.prop1
  • Кронштейн позначення: myObj [ "prop1"]

Позначення крапок швидко і легко, але потрібно використовувати чітко ім'я власності. Відсутня підміна, змінні тощо.

Нотація дужок відкрита. Він використовує рядок, але ви можете створити рядок, використовуючи будь-який законний js-код. Ви можете вказати рядок як буквальний (хоча в цьому випадку позначення крапок читатимуться легше) або використовувати змінну або обчислити якимось чином.

Таким чином, це все встановити myObj властивість з ім'ям prop1 до значення 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

За допомогою 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" } } }

2

Спочатку нам потрібно визначити ключ як змінний, а потім нам потрібно призначити як ключ як об'єкт. Наприклад,

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



0

Якщо ви хочете динамічно додавати поля до об'єкта, найпростіший спосіб це зробити наступним чином:

 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}

0

Якщо у вас є об'єкт, ви можете створити масив ключів, аніж промальовувати, та створити новий об'єкт із попередніх клавіш об'єктів та значень.

Object.keys(myObject)
.map(el =>{
 const obj = {};
 obj[el]=myObject[el].code;
 console.log(obj);
});

0

ajavascript має два типи анотацій для отримання властивостей об’єкта JavaScript:

Obj = {};

1) (.) Анотація, наприклад. Obj.id це буде працювати лише в тому випадку, якщо в об'єкта вже є властивість з назвою 'id'

2) ([]) анотація, наприклад. Obj [id] тут, якщо об’єкт не має жодного властивості з назвою 'id', він створить нову властивість з ім'ям 'id'.

так для наведеного нижче прикладу:

Нова властивість буде створюватися завжди, коли ви пишете Obj [ім'я]. І якщо властивість уже існує з такою ж назвою, вона замінить її.

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

0

Зв'язано з темою, але не спеціально для jquery. Я використовував це в проектах реагування на ec6, можливо, хтось допомагає:

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

PS: Будь ласка, пам’ятайте про цитату.



-2
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;

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.