Em JavaScript, eu criei um objeto assim:
var data = {
'PropertyA': 1,
'PropertyB': 2,
'PropertyC': 3
};
É possível adicionar mais propriedades a esse objeto após sua criação inicial, se o nome da propriedade não for determinado até o tempo de execução? ie
var propName = 'Property' + someUserInput
//imagine someUserInput was 'Z', how can I now add a 'PropertyZ' property to
//my object?
javascript
Lee D
fonte
fonte
object["property"]
não é exatamente o mesmo quearray[4]
, o primeiro não foi criado como uma matriz verdadeira.data["PropertyD"]
paradata[function_to_get_property_name()]
parece trivial.ES6 para a vitória!
Se você fizer logon,
data
obtém o seguinte:Isso faz uso da nova sintaxe da propriedade computada e dos literais do modelo .
fonte
obj[propname]
). Em vez disso, eu era capaz de usar isso com sintaxe de propagação de objeto.var a = {}; a["dynamic-" + prop] = true;
a
. (Especialmente quando utilizar pacotes como redux)Sim, é possível. Assumindo:
Ou:
ou
O primeiro método é preferido. eval () tem as óbvias preocupações de segurança se você estiver usando valores fornecidos pelo usuário, portanto, não o utilize se puder evitá-lo, mas vale a pena saber que ele existe e o que ele pode fazer.
Você pode fazer referência a isso com:
ou
ou
fonte
$("#mySelector").data("propertyname", myvalue);
para definir evar myValue=$("#mySelector").data("propertyname");
recuperar o valor. Mesmo objetos complexos (listas, matrizes ...) podem ser adicionados dessa maneira.Sei que a pergunta foi respondida perfeitamente, mas também encontrei outra maneira de adicionar novas propriedades e queria compartilhá-la com você:
Você pode usar a função
Object.defineProperty()
Encontrado na Mozilla Developer Network
Exemplo:
fonte
defineProperties
(plural).Object.defineProperty
não deve ser a ferramenta de conveniência fácil, mas a ferramenta com controle refinado. Se você não precisar desse controle adicional, não é a ferramenta certa para escolher.Object.defineProperty(obj, prop, valueDescriptor)
é muito mais lento e difícil para o V8 otimizar do que simplesmenteobj[prop] = value
;O ES6 apresenta nomes de propriedades computados, que permitem fazer
fonte
Aqui, usando sua notação:
fonte
Você pode adicionar quantas propriedades quiser, simplesmente usando a notação de ponto:
ou :
para chaves dinâmicas.
fonte
além de todas as respostas anteriores, e caso você esteja se perguntando como escreveremos nomes de propriedades dinâmicas no futuro usando nomes de propriedades computadas (ECMAScript 6), veja como:
Referência: Compreendendo o ECMAScript 6 - Nickolas Zakas
fonte
Apenas uma adição à resposta da abeing acima. Você pode definir uma função para encapsular a complexidade de defineProperty, conforme mencionado abaixo.
referência: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#constructorpatternjavascript
fonte
Você pode adicionar propriedades dinamicamente usando algumas das opções abaixo:
No seu exemplo:
Você pode definir uma propriedade com um valor dinâmico das próximas duas maneiras:
ou
Ainda mais ... se sua chave também for dinâmica, você poderá definir usando a classe Object com:
onde data é seu objeto, key é a variável para armazenar o nome da chave e value é a variável para armazenar o valor.
Eu espero que isso ajude!
fonte
Eu sei que já existem várias respostas para este post, mas ainda não vi uma em que haja várias propriedades e elas estejam dentro de uma matriz. E esta solução, a propósito, é para ES6.
Para ilustração, digamos que temos uma matriz chamada pessoa com objetos dentro:
Portanto, você pode adicionar uma propriedade com o valor correspondente. Digamos que queremos adicionar um idioma com o valor padrão EN .
A matriz Person agora se tornaria assim:
fonte
Person = Person.map(code here)
. Mas o ponto é que você pode adicionar propriedades facilmente a um objeto existenteES6
.A maneira mais simples e mais portátil é.
Com base na resposta #abeing!
fonte
Tenha cuidado ao adicionar uma propriedade ao objeto existente usando o método . (Ponto) .
O método (.dot) de adicionar uma propriedade ao objeto só deve ser usado se você conhecer a 'chave' anteriormente, caso contrário, use o método [bracket] .
Exemplo:
Observe o problema no final do log do console - 'chave: 1999' em vez de Propriedade6: 6, Propriedade7: 7, ........., Propriedade1999: 1999 . Portanto, a melhor maneira de adicionar propriedades criadas dinamicamente é o método [bracket].
fonte
Uma ótima maneira de acessar nomes dinâmicos de cadeias que contêm objetos (por exemplo, object.subobject.property)
Exemplo:
eval funciona com valor de leitura, mas o valor de gravação é um pouco mais difícil.
Uma versão mais avançada (crie subclasses se elas não existirem e permita objetos em vez de variáveis globais)
Exemplo:
É o mesmo que o.object.subobject.property
fonte
Aqui está como eu resolvi o problema.
Gera o seguinte objeto:
fonte
Pode ser útil se uma nova propriedade mista for adicionada no tempo de execução:
No entanto, o operador de propagação usa cópia superficial, mas aqui atribuímos dados a si mesmo, para que não perca nada
fonte
Uma maneira fácil e perfeita
Se você deseja aplicá-lo em uma matriz de dados (versão ES6 / TS)
fonte
Definitivamente. Pense nisso como um dicionário ou matriz associativa. Você pode adicionar a qualquer momento.
fonte