Longitud de matriz de Javascript incorrecta en una matriz de objects

¿Podría alguien explicar este comportamiento (extraño)? ¿Por qué es la longitud en el primer ejemplo 3 y no 2, y lo más importante, por qué es la longitud en el segundo ejemplo 0? Siempre que las teclas sean numéricas, la longitud funciona. Cuando no lo son, la longitud es 0. ¿Cómo puedo get la longitud correcta del segundo ejemplo? Gracias.

a = []; a["1"] = {"string1":"string","string2":"string"}; a["2"] = {"string1":"string","string2":"string"}; alert(a.length); // returns 3 b = []; b["key1"] = {"string1":"string","string2":"string"}; b["key2"] = {"string1":"string","string2":"string"}; alert(b.length); // returns 0 

  • Mover el elemento de matriz al frente mediante la tecla de object
  • Iterando sobre Arrays en Javascript
  • Forma eficiente de la memory para almacenar la list de integers
  • Javascript | Establecer todos los valores de una matriz
  • Cómo aplanar una matriz anidada en javascript?
  • Convierta la matriz en una oración separada gtwigticalmente y separada por comas
  • Matriz de bytes para la conversión de cadenas hexadecimales en JavaScript
  • forEach not working when for loop lo hace con una matriz de objects
  • 3 Solutions collect form web for “Longitud de matriz de Javascript incorrecta en una matriz de objects”

    Una cosa a tener en count es que hay una diferencia entre las matrices regulares y las matrices asociativas. En arreglos regulares (matrices reales), el índice tiene que ser un número integer. Por otro lado, las matrices asociativas pueden usar cadenas como un índice. Puede pensar en matrices asociativas como un map si lo desea. Ahora, también tenga en count, las matrices verdaderas siempre comienzan desde cero. Por lo tanto, en su ejemplo, creó una matriz de la siguiente manera:

     a = []; a["1"] = {"string1":"string","string2":"string"}; a["2"] = {"string1":"string","string2":"string"} 

    Javascript pudo convertir sus índices de cadena en numbers, por lo tanto, su código anterior se convierte en:

     a = []; a[1] = {"blah"}; a[2] = {"blah"}; 

    Pero restring lo que dije antes: las matrices verdaderas comienzan desde cero. Por lo tanto, el intérprete de JavaScript asignó automáticamente un [0] al indefinido. Pruébelo en Firebug o en la console de Chrome / Safari, y verá algo como esto cuando intente imprimir "a". Debería get algo como "[undefined, Object, Object]. De ahí el tamaño 3 no 2 como esperaba.

    En su segundo ejemplo, estoy bastante seguro de que está tratando de simular el uso de una matriz asociada, que esencialmente es agregar properties a un object. Recuerde que las matrices asociadas le permiten usar cadenas como una key. Entonces, en otros términos, está agregando una propiedad al object. Entonces en tu ejemplo:

     b["key1"] = {"string1":"string","string2":"string"}; 

    esto realmente significa:

     b.key1 = {"string1":"string","string2":"string"}; 

    Inicializar b = [] simplemente crea una matriz, pero su asignación no llena la matriz. Simplemente le da properties extra "b". Espero que esto ayude.. 🙂

    length devuelve 1 + la key entera más grande en el object.

    En a la key más grande es 2, entonces 1 + 2 es 3.

    En b no hay keys enteras (las keys allí son key2 y key2 que no se pueden convertir en ints), por lo que Javascript asume que la key más grande es -1 , y 1 + -1 rinde 0 .

    Este progtwig te ayudará a ver eso:

     a = []; a["1"] = {}; a["4"] = {}; alert(a.length); // Prints 5 

    Del estándar ECMAScript, ECMA-262, 5ª ed.

    15.4.5.2 longitud

    La propiedad de longitud de este object Array es una propiedad de datos cuyo valor siempre es numéricamente mayor que el nombre de cada propiedad eliminable cuyo nombre es un índice de matriz.

    Tenga en count que la propiedad de longitud de una matriz solo tiene en count los índices de matriz, que son integers; establecer otras properties no afecta la longitud.

    Para una matriz, a["3"] es equivalente a a[3] (este comportamiento se especifica en el § 15.4.5.1); 3 es un índice de matriz en lugar de una propiedad. Por lo tanto, establecer a["3"] afecta la longitud del set. b["key1"] es equivalente a b.key1 . Las properties de configuration no afectan la longitud de una colección.

    Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.