Добавить свойство в объект 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
Этот вопрос касается модификации существующего объекта, а не создания нового.
Михал Перлаковский

28
Этот конкретный вопрос может быть об изменении, но на него ссылаются другие вопросы, касающиеся динамического создания объектов, и поэтому я оказался здесь и с удовольствием получил этот ответ.
Оливер Ллойд

2
@wOxxOm lol, да, с чего бы мне было переживать, obj[name]=valueкогда я мог бы просто использовать твое предложение вместо этого
chiliNUT

2
Я не уверен, что такое ECMAScript 6, но я очень ценю это
Артур Тарасов

2
@ArthurTarasov: ECMAScript 6 более формально называется ECMAScript 2015 («ES2015») или 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

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

  • Точечная запись: 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.