Cuando creo una nueva matriz de JavaScript y uso un número entero como clave, cada elemento de esa matriz hasta el número entero se crea como indefinido.
Por ejemplo:
var test = new Array();
test[2300] = 'Some string';
console.log(test);
generará 2298 indefinidos y una 'Alguna cadena'.
¿Cómo debo hacer que JavaScript use 2300 como una cadena en lugar de un número entero, o cómo debo evitar que instancia 2299 índices vacíos?
javascript
associative-array
Peter Mortensen
fuente
fuente
0.25
y.25
resuelve en la misma cadena"0.25"
. Así que si estás usando las teclas fraccionaria, podrá recuperar la propiedad de una llave ajustar de forma numérica0.25
usando0.25
,.25
,"0.25"
pero no".25"
.Puedes usar un objeto:
fuente
Como dice la gente, JavaScript convertirá una cadena de número en entero, por lo que no es posible usarlo directamente en una matriz asociativa, pero creo que los objetos funcionarán para usted de manera similar.
Puedes crear tu objeto:
Y agregue los valores como funciona la matriz:
Esto te dará:
Después de eso, puede acceder a él como una matriz en otros idiomas obteniendo la clave:
Lo he probado y funciona.
fuente
Si el caso de uso es almacenar datos en una colección, ECMAScript 6 proporciona el
Map
tipo.Solo es más pesado de inicializar.
Aquí hay un ejemplo:
Resultado:
fuente
Compilando otras respuestas:
Objeto
Cuando se usa un número como clave de una nueva propiedad, el número se convierte en una cadena:
Al acceder al valor de la propiedad con el mismo número, el número se convierte nuevamente en una cadena:
Sin embargo, al obtener las claves del objeto, no se volverán a convertir en números:
Mapa
ECMAScript 6 permite el uso del objeto Map ( documentación , una comparación con Object ). Si su código está destinado a ser interpretado localmente o la tabla de compatibilidad de ECMAScript 6 parece lo suficientemente verde para sus propósitos, considere usar un mapa:
No se realiza ninguna conversión de tipo, para bien o para mal:
fuente
Utilice un objeto en lugar de una matriz. Las matrices en JavaScript no son matrices asociativas. Son objetos con magia asociada con cualquier propiedad cuyos nombres parecen números enteros. Esa magia no es lo que desea si no los está usando como una estructura tradicional similar a una matriz.
fuente
Intente usar un objeto, no una matriz:
fuente
var a = []; a[Math.pow(2, 30)] = 'hello';
y no verá que el uso del navegador / memoria se dispare en más de un gigabyte, pero verá quea.length
es 1073741824. Las máquinas virtuales almacenan claramente algunas "matrices" usando alguna otra estructura de datos, supongo que simplemente una tabla hash, al menos si son lo suficientemente escasos.Obtenga el valor de una propiedad de matriz asociativa cuando el nombre de la propiedad es un número entero:
Comenzando con una matriz asociativa donde los nombres de las propiedades son números enteros:
Empuje elementos a la matriz:
Recorra la matriz y haga algo con el valor de la propiedad.
La salida de la consola debería verse así:
Como puede ver, puede sortear la limitación de la matriz asociativa y hacer que el nombre de una propiedad sea un número entero.
NOTA: La matriz asociativa en mi ejemplo es el contenido JSON que tendría si serializara un objeto Dictionary <string, string> [].
fuente
Utilice un objeto, con un número entero como clave, en lugar de una matriz.
fuente
A veces utilizo prefijos para mis claves. Por ejemplo:
Ahora no tienes ningún problema para acceder a ellos.
fuente