Da postagem:
Enviando uma matriz JSON para ser recebida como um Dicionário <string, string>
Estou tentando fazer a mesma coisa que esse post. O único problema é que não sei quais são as chaves e os valores iniciais. Portanto, preciso adicionar dinamicamente os pares de chave e valor e não sei como fazer isso.
Alguém sabe como criar esse objeto e adicionar pares de valores-chave dinamicamente?
Eu tentei:
var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";
Mas isso não funciona.
javascript
dictionary
key-value
KenEucker
fonte
fonte
list = [["key1","value1"],["key2","value2"]]
. Alguns outros idiomas têm um tipo de "par" ou "tupla". tldr para adição de ditado real:dict['key'] = "value"
Respostas:
Basicamente, você está criando um literal de objeto com 2 propriedades (chamado
key
evalue
) e o inserindo (usandopush()
) na matriz.Edit: Então, quase 5 anos depois, esta resposta está recebendo votos negativos porque não está criando um literal de objeto JS "normal" (aka mapa, aka hash, aka dicionário).
No entanto, está criando a estrutura que o OP solicitou (e que é ilustrada na outra questão vinculada a), que é uma matriz de literais de objetos , cada um com propriedades
key
evalue
. Não me pergunte por que essa estrutura foi necessária, mas foi solicitada.Mas, mas, se o que você deseja em um objeto JS simples - e não na estrutura solicitada pelo OP - veja a resposta do tcll , embora a notação entre colchetes seja um pouco complicada se você tiver apenas chaves simples com nomes JS válidos. Você pode fazer isso:
Ou use a notação de ponto regular para definir propriedades depois de criar um objeto:
Você não quer que a notação de colchetes se você tem as chaves que têm espaços entre eles, caracteres especiais, ou coisas assim. Por exemplo:
Você também deseja notação de colchete se suas chaves forem dinâmicas:
Observe que as chaves (nomes de propriedades) são sempre cadeias e os valores que não são de cadeia serão coagidos a uma cadeia quando usados como uma chave. Por exemplo, um
Date
objeto é convertido em sua representação de string:Observe, no entanto, que isso não necessariamente "apenas funciona", pois muitos objetos terão uma representação de string como
"[object Object]"
que não cria uma chave não exclusiva. Portanto, tenha cuidado com algo como:Apesar
objA
eobjB
por serem elementos completamente diferentes e únicos, ambos têm a mesma representação básica string:"[object Object]"
.O motivo
Date
não se comporta dessa maneira é que oDate
protótipo possui umtoString
método personalizado que substitui a representação de string padrão. E você pode fazer o mesmo:(Observe que, como o descrito acima, usa um método aleatório número , as colisões de nomes ainda podem ocorrer com muita facilidade. É apenas para ilustrar uma implementação de
toString
.)Portanto, ao tentar usar objetos como chaves, o JS usará a própria
toString
implementação do objeto , se houver, ou usará a representação de sequência padrão.fonte
dict
não é um dicionário associativo. É uma matriz de objetos, cada um dos quais é um dicionário com duas chaves: "chave" e "valor".funciona como python :)
saída do console:
fonte
{}
em vez de parêntesesÉ tão simples quanto:
ou
então
fonte
Desde que você declarou que deseja um objeto de dicionário (e não uma matriz como eu assumo que alguns entendam), acho que é isso que você procura:
fonte
JavaScript
Object
é em si mesmo como um dicionário. Não há necessidade de reinventar a roda.Violino
fonte
Você pode usar mapas com
Map
, assim:fonte
Por acaso, passei por essa pergunta procurando algo semelhante. Isso me deu informações suficientes para executar um teste e obter a resposta que eu queria. Portanto, se alguém quiser saber como adicionar ou procurar dinamicamente um par {key: 'value'} em um objeto JavaScript, esse teste deve informar tudo o que você precisa saber.
resultado
fonte
fonte
key1 = dictionary.key1
ao invés de índicekey1 = dictionary["key1"]
Você pode criar um dicionário de classe para interagir facilmente com a lista Dicionário:
fonte
e o liner único para criar um par de valores-chave?
e algumas funções do iterador gostam
reduce
de converter dinamicamente uma matriz em um dicionáriofonte
No javascript moderno (ES6 / ES2015), deve-se usar a estrutura de dados do mapa para o dicionário. A estrutura de dados do mapa no ES6 permite usar valores arbitrários como chaves.
Enquanto você ainda usa o ES5, a maneira correta de criar dicionário é criar objeto sem um protótipo da seguinte maneira.
Há muitas vantagens em criar um dicionário sem um objeto de protótipo. Os blogs abaixo valem a pena ler sobre esse tópico.
padrão de ditado
objetos-como-mapas
fonte
Ajudaria muito saber qual é o seu resultado final desejado, mas acho que é isso que você deseja:
fonte
Corri para este problema .. mas dentro de um loop for. A solução superior não funcionou (ao usar variáveis (e não cadeias) para os parâmetros da função push), e as outras não foram responsáveis por valores-chave baseados em variáveis. Fiquei surpreso que esta abordagem (que é comum em php) funcionou ..
fonte
Uma melhoria
var dict = {}
é usarvar dict = Object.create(null)
.Isso criará um objeto vazio que não possui
Object.prototype
como protótipo.fonte
fonte