Estou tentando acessar uma propriedade de um objeto usando um nome dinâmico. Isso é possível?
const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"
javascript
object
properties
RichW
fonte
fonte
Respostas:
Existem duas maneiras de acessar propriedades de um objeto:
something.bar
something['bar']
O valor entre colchetes pode ser qualquer expressão. Portanto, se o nome da propriedade estiver armazenado em uma variável, você precisará usar a notação de colchete:
fonte
Esta é a minha solução:
Exemplos de uso:
fonte
Em javascript, podemos acessar com:
foo.bar
foo[someVar]
oufoo["string"]
Mas apenas o segundo caso permite acessar propriedades dinamicamente:
fonte
A seguir, é apresentado um exemplo do ES6 de como você pode acessar a propriedade de um objeto usando um nome de propriedade que foi gerado dinamicamente pela concatenação de duas cadeias.
Isso é chamado de nomes de propriedades computados
fonte
Você pode conseguir isso de várias maneiras diferentes.
A notação de colchete é especialmente poderosa, pois permite acessar uma propriedade com base em uma variável:
Isso pode ser estendido ao loop sobre todas as propriedades de um objeto. Isso pode parecer redundante devido a construções JavaScript mais recentes, como para ... de ..., mas ajuda a ilustrar um caso de uso:
A notação de ponto e colchete também funciona conforme o esperado para objetos aninhados:
Destruição de objetos
Também podemos considerar a destruição de objetos como um meio de acessar uma propriedade em um objeto, mas da seguinte maneira:
fonte
Você pode fazer isso usando o Lodash get
fonte
ATUALIZADA
Levei em consideração os comentários abaixo e concordei. Eval deve ser evitado.
O acesso às propriedades raiz no objeto é facilmente alcançado
obj[variable]
, mas ficar aninhado complica as coisas. Para não escrever código já escrito, sugiro usarlodash.get
.Exemplo
O Lodash get pode ser usado de diferentes maneiras. Aqui está o link para a documentação lodash.get
fonte
eval
sempre que possível. stackoverflow.com/questions/86513/…eval
algo tão trivial quanto acessar propriedades é um exagero e dificilmente aconselhável sob nenhuma circunstância. O que é "problema"?obj['nested']['test']
funciona muito bem e não requer que você incorpore código em strings.obj['nested']['value']
- lembre-se crianças, eval é mau!_.get
para a mesa. Penso que esta resposta merece agora votos em vez de votos negativos. Pode ser um exagero, mas é bom saber que existe.Sempre que você precisar acessar a propriedade dinamicamente, precisará usar colchetes para acessar a propriedade, não "." operador
Sintaxe: object [propery}
fonte
Me deparei com um caso em que achava que queria passar o "endereço" de uma propriedade de objeto como dados para outra função e preencher o objeto (com AJAX), pesquisar na matriz de endereços e exibir nessa outra função. Eu não poderia usar a notação de ponto sem fazer acrobacias de string, então pensei que uma matriz poderia ser boa para passar. Acabei fazendo algo diferente de qualquer maneira, mas parecia relacionado a este post.
Aqui está uma amostra de um objeto de arquivo de idioma como o de onde eu queria dados:
Eu queria poder transmitir uma matriz como: ["audioPlayer", "controls", "stop"] para acessar o texto do idioma, "stop" neste caso.
Eu criei essa pequena função que consulta o parâmetro de endereço "menos específico" (primeiro) e reatribui o objeto retornado a si mesmo. Então, está pronto para procurar o próximo parâmetro de endereço mais específico, se houver algum.
uso:
fonte
Fica interessante quando você também precisa passar parâmetros para essa função.
Código jsfiddle
fonte
ES5 // Verificar variáveis profundamente aninhadas
Este simples trecho de código pode verificar a existência de variáveis / valores profundamente aninhados sem precisar verificar cada variável ao longo do caminho ...
Ex. - uma matriz de objetos profundamente aninhada:
Ao invés de :
Agora podemos:
Felicidades!
fonte
Function
vez dissoEu fiz uma pergunta que meio que foi duplicada sobre esse tópico há algum tempo, e após uma pesquisa excessiva e vendo muitas informações ausentes que deveriam estar aqui, sinto que tenho algo valioso a acrescentar a este post antigo.
no entanto, raramente vou nessa rota porque não funciona nos valores de propriedades atribuídos por meio de folhas de estilo. Para dar um exemplo, demonstrarei com um pouco de pseudo-código.
Usando o exemplo de código acima; se a propriedade width do elemento div que foi armazenada na variável 'elem' foi estilizada em uma folha de estilo CSS e não estilizada dentro de sua tag HTML, sem dúvida você obterá um valor de retorno de indefinido armazenado dentro da variável cssProp. O valor indefinido ocorre porque, para obter o valor correto, o código escrito em uma folha de estilo CSS precisa ser calculado para obter o valor; você deve usar um método que calcule o valor da propriedade cujo valor esteja na folha de estilos.
W3Schools getComputedValue Doc Isso fornece um bom exemplo e permite que você brinque com ele, no entanto, este link O documento getComputedValue do CSS do Mozilla fala sobre a função getComputedValue em detalhes e deve ser lido por qualquer desenvolvedor que não seja totalmente claro sobre esse assunto.
... recebe e define. É o que eu uso, a única desvantagem é que você conhece o JQuery, mas essa é honestamente uma das muitas boas razões para que todo desenvolvedor Javascript deva aprender o JQuery, isso facilita a vida e oferece métodos como este, que não está disponível com Javascript padrão. Espero que isso ajude alguém !!!
fonte
Para quem deseja definir o valor de uma variável aninhada, veja como fazê-lo:
Documentação: https://lodash.com/docs/4.17.15#set
Além disso, a documentação se você deseja obter um valor: https://lodash.com/docs/4.17.15#get
fonte
Você deve usar
JSON.parse
, dê uma olhada em https://www.w3schools.com/js/js_json_parse.aspfonte
fonte
foo
já é uma string, então`${foo}`
é exatamente o mesmo quefoo
. (Além disso, o código parece ter algumas barras invertidas extras que não pertencem lá Mas ainda seria inútil mesmo se você fixa que erro de sintaxe..)