Adicionar uma propriedade a um objeto JavaScript usando uma variável como o nome?


277

Estou retirando itens do DOM com jQuery e quero definir uma propriedade em um objeto usando o idelemento DOM.

Exemplo

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

Se itemsFromDomincluir um elemento com um id"myId", desejo objter uma propriedade chamada "myId". O acima me dá name.

Como nomeio uma propriedade de um objeto usando uma variável usando JavaScript?



Respostas:


469

Você pode usar esta sintaxe equivalente:

obj[name] = value

122

Com o ECMAScript 2015, você pode fazê-lo diretamente na declaração do objeto usando a notação de colchete:

var obj = {
  [key]: value
}

Onde keypode haver qualquer tipo de expressão (por exemplo, uma variável) retornando um valor:

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

13
Esta pergunta é sobre modificar um objeto existente, não criar um novo.
Michał Perłakowski

28
Essa pergunta em particular pode ser sobre modificação, mas é referenciada por outras questões sobre criação de objetos dinamicamente e, por isso, acabei aqui e felizmente me beneficiei com essa resposta.
Oliver Lloyd

2
@wOxxOm lol sim por que eu iria passar pelo incômodo de obj[name]=valuequando eu poderia usar apenas a sua sugestão em vez
chiliNUT

2
Eu não tenho certeza do que ECMAScript 6 é, mas eu aprecio muito
Arthur Tarasov

2
@ArthurTarasov: O ECMAScript 6 é mais formalmente chamado de ECMAScript 2015 ("ES2015"), também conhecido como ECMAScript 6th edition ("ES6"). É a especificação para JavaScript lançada em junho de 2015. Desde então, temos o ES2016 e em breve o ES2017, eles estão em um ciclo anual agora.
TJ Crowder

12

Você pode até criar uma lista de objetos como este

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

Existem duas notações diferentes para acessar propriedades do objeto

  • Notação de ponto : myObj.prop1
  • Notação de colchete : myObj ["prop1"]

A notação de ponto é rápida e fácil, mas você deve usar o nome real da propriedade explicitamente. Sem substituição, variáveis, etc.

A notação do suporte é aberta. Ele usa uma sequência, mas você pode produzi-la usando qualquer código js legal. Você pode especificar a string como literal (embora, nesse caso, a notação de pontos seja mais fácil) ou usar uma variável ou calcular de alguma forma.

Então, todos estes definir o myObj propriedade chamada prop1 ao valor Olá :

// 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";     

Armadilhas:

myObj.[xxxx] = "Hello";      // wrong: mixed notations, syntax fail
myObj[prop1] = "Hello";      // wrong: this expects a variable called prop1

tl; dnr : Se você quiser calcular ou fazer referência a chave que você deve usar notação de colchetes . Se você estiver usando a chave explicitamente, use a notação de ponto para obter um código claro simples.

Nota: existem outras respostas boas e corretas, mas eu pessoalmente as achei um pouco breves, provenientes de uma baixa familiaridade com a peculiaridade do JS on-the-fly. Isso pode ser útil para algumas pessoas.


3

Com o lodash, você pode criar um novo objeto como este _.set :

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

Ou você pode definir o objeto existente como este:

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

Você deve tomar cuidado se quiser usar ponto (".") No seu caminho, porque o lodash pode definir a hierarquia, por exemplo:

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

2

Primeiro, precisamos definir chave como variável e, em seguida, atribuir como chave como objeto., Por exemplo

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



0

Se você deseja adicionar campos a um objeto dinamicamente, a maneira mais simples de fazer isso é a seguinte:

 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
}

Isso criará um objeto de dados que possui os seguintes campos:

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

0

Se você tiver um objeto, poderá criar uma matriz de chaves para mapear e criar um novo objeto a partir das chaves e valores anteriores.

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

0

O ajavascript possui dois tipos de anotação para buscar propriedades do objeto javascript:

Obj = {};

1) anotação (.) Por exemplo. Obj.id isso só funcionará se o objeto já tiver uma propriedade com o nome 'id'

2) ([]) anotação, por exemplo. Obj [id] aqui, se o objeto não tiver nenhuma propriedade com o nome 'id', ele criará uma nova propriedade com o nome 'id'.

então, para o exemplo abaixo:

Uma nova propriedade será criada sempre que você escrever Obj [nome]. E se a propriedade já existir com o mesmo nome, ela será substituída.

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

Relacionado ao assunto, não especificamente para jquery. Eu usei isso em projetos de reação ec6, talvez ajude alguém:

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

PS: Lembre-se do caractere de citação.



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

}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.