Quando eu crio um novo array JavaScript e uso um inteiro como chave, cada elemento desse array até o inteiro é criado como indefinido.
Por exemplo:
var test = new Array();
test[2300] = 'Some string';
console.log(test);
irá imprimir 2298 undefined's e um 'Some string'.
Como devo fazer com que o JavaScript use 2300 como uma string em vez de um inteiro, ou como devo evitar que instancie 2299 índices vazios?
javascript
associative-array
Peter Mortensen
fonte
fonte
0.25
e.25
resolva para a mesma string"0.25"
. Então, se você estiver usando chaves fracionários, você pode recuperar a propriedade de uma chave numérica definida0.25
usando0.25
,.25
,"0.25"
mas não".25"
.Você pode apenas usar um objeto:
fonte
Como as pessoas dizem, o JavaScript irá converter uma string de número em inteiro, então não é possível usar diretamente em uma matriz associativa, mas os objetos funcionarão para você de maneira semelhante, eu acho.
Você pode criar seu objeto:
E adicione os valores conforme a matriz funciona:
Isso lhe dará:
Depois disso, você pode acessá-lo como um array em outras línguas obtendo a chave:
Eu testei e funciona.
fonte
Se o caso de uso estiver armazenando dados em uma coleção, o ECMAScript 6 fornece o
Map
tipo.É apenas mais pesado para inicializar.
Aqui está um exemplo:
Resultado:
fonte
Compilando outras respostas:
Objeto
Ao usar um número como a chave de uma nova propriedade, o número se transforma em uma string:
Ao acessar o valor da propriedade usando o mesmo número, o número é transformado em string novamente:
Ao obter as chaves do objeto, no entanto, elas não serão transformadas em números:
Mapa
ECMAScript 6 permite o uso do objeto Map ( documentação , uma comparação com Object ). Se seu código deve ser interpretado localmente ou se a tabela de compatibilidade ECMAScript 6 parece verde o suficiente para seus objetivos, considere o uso de um mapa:
Nenhuma conversão de tipo é realizada, para o melhor ou para o pior:
fonte
Use um objeto em vez de uma matriz. Arrays em JavaScript não são arrays associativos. Eles são objetos com magia associada a quaisquer propriedades cujos nomes pareçam inteiros. Essa mágica não é o que você deseja se não os estiver usando como uma estrutura tradicional semelhante a um array.
fonte
Tente usar um objeto, não um array:
fonte
var a = []; a[Math.pow(2, 30)] = 'hello';
e você não verá o uso do navegador / memória aumentar em mais de um gigabyte, mas verá quea.length
é 1073741824. As VMs armazenam claramente alguns "arrays" usando alguma outra estrutura de dados, suponho que seja simplesmente um hashtable, pelo menos se eles são suficientemente esparsos.Obtenha o valor de uma propriedade de matriz associativa quando o nome da propriedade for um inteiro:
Começando com uma matriz associativa em que os nomes das propriedades são inteiros:
Envie itens para a matriz:
Faça um loop pela matriz e faça algo com o valor da propriedade.
A saída do console deve ser assim:
Como você pode ver, você pode contornar a limitação da matriz associativa e ter um nome de propriedade um inteiro.
NOTA: O array associativo em meu exemplo é o conteúdo JSON que você teria se serializasse um objeto Dictionary <string, string> [].
fonte
Use um objeto - com um inteiro como chave - em vez de uma matriz.
fonte
Às vezes eu uso prefixos para minhas chaves. Por exemplo:
Agora você não tem nenhum problema para acessá-los.
fonte