Tengo un objeto JavaScript, ¿hay una forma de práctica recomendada incorporada o aceptada para obtener la longitud de este objeto?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
javascript
javascript-objects
Gareth Simpson
fuente
fuente
Object.keys(obj).length
Respuestas:
La respuesta más sólida (es decir, que captura la intención de lo que está tratando de hacer mientras causa la menor cantidad de errores) sería:
Hay una especie de convención en JavaScript en la que no agrega cosas a Object.prototype , porque puede romper las enumeraciones en varias bibliotecas. Sin embargo, agregar métodos a Object generalmente es seguro.
Aquí hay una actualización a partir de 2016 y una implementación generalizada de ES5 y más allá. Para IE9 + y todos los otros navegadores modernos con capacidad ES5 +, puede usar
Object.keys()
para que el código anterior se convierta en:Esto no tiene que modificar ningún prototipo existente ya
Object.keys()
que ahora está integrado.Editar : los objetos pueden tener propiedades simbólicas que no se pueden devolver a través del método Object.key. Entonces la respuesta sería incompleta sin mencionarlos.
El tipo de símbolo se agregó al idioma para crear identificadores únicos para las propiedades del objeto. El principal beneficio del tipo de símbolo es la prevención de sobrescrituras.
Object.keys
oObject.getOwnPropertyNames
no funciona para propiedades simbólicas. Para devolverlos necesitas usarObject.getOwnPropertySymbols
.fuente
Object.keys(obj).length
Si sabe que no tiene que preocuparse por los
hasOwnProperty
cheques, puede hacerlo de manera muy simple:fuente
Actualizado : si está utilizando Underscore.js (¡recomendado, es liviano!), Entonces simplemente puede hacer
Si no es así , y no desea perder el tiempo con las propiedades de Object por cualquier razón, y ya está utilizando jQuery, un complemento es igualmente accesible:
fuente
_.size()
fue la solución perfecta para mi proyecto Meteor , que tiene soporte para subrayar.js.Aquí está la solución más cruzada del navegador.
Esto es mejor que la respuesta aceptada porque usa Object.keys nativo si existe. Por lo tanto, es el más rápido para todos los navegadores modernos.
fuente
Object.keys()
devuelve una matriz que contiene los nombres de solo aquellas propiedades que son enumerables. Si desea una matriz con TODAS las propiedades, debe usarlaObject.getOwnPropertyNames()
en su lugar. Ver developer.mozilla.org/en/docs/Web/JavaScript/Reference/…No soy un experto en JavaScript, pero parece que tendría que recorrer los elementos y contarlos ya que Object no tiene un método de longitud:
@palmsey: Para ser justos con el OP, la documentación de JavaScript se refiere explícitamente al uso de variables de tipo Object de esta manera como "matrices asociativas".
fuente
Este método obtiene todos los nombres de propiedad de su objeto en una matriz, por lo que puede obtener la longitud de esa matriz que es igual a la longitud de las claves de su objeto.
fuente
Para no meterse con el prototipo u otro código, puede construir y extender su propio objeto:
Si siempre usa el método add, la propiedad de longitud será correcta. Si le preocupa que usted u otros se olviden de usarlo, también puede agregar el contador de propiedades que los demás han publicado al método de longitud.
Por supuesto, siempre puedes sobrescribir los métodos. Pero incluso si lo hace, su código probablemente fallará notablemente, lo que facilitará la depuración. ;)
fuente
Aquí le mostramos cómo y no olvide verificar que la propiedad no esté en la cadena de prototipos:
fuente
Simplemente use esto para obtener
length
:fuente
myArray
Aquí hay una solución completamente diferente que solo funcionará en navegadores más modernos (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+)
Ver jsFiddle
Configure su clase de matriz asociativa
Ahora puede usar este código de la siguiente manera ...
fuente
length
propiedad, cualquier código que lo use tendría que asegurarse de que no intente almacenarlolength
, pero supongo que sería lo mismo si fuera una matriz estándar también. AnularhasOwnProperty
cualquier objeto probablemente produciría un resultado no deseado.Esto funciona para mi:
fuente
En algunos casos, es mejor simplemente almacenar el tamaño en una variable separada. Especialmente, si está agregando a la matriz por un elemento en un lugar y puede aumentar fácilmente el tamaño. Obviamente, funcionaría mucho más rápido si necesita verificar el tamaño con frecuencia.
fuente
Utilizar:
fuente
Y para ser justos con @palmsey, él era bastante correcto, no son matrices asociativas, definitivamente son objetos :), haciendo el trabajo de una matriz asociativa. Pero en lo que respecta al punto más amplio, definitivamente parece tener el derecho de acuerdo con este artículo bastante bueno que encontré:
JavaScript "Matrices asociativas" considerado perjudicial
Pero de acuerdo con todo esto, ¿no es la respuesta aceptada en sí misma una mala práctica?
Si se ha agregado algo más al Object .prototype, el código sugerido fallará:
No creo que esa respuesta sea la aceptada, ya que no se puede confiar en que funcione si tiene algún otro código ejecutándose en el mismo contexto de ejecución. Para hacerlo de una manera robusta seguramente necesitará definir el método de tamaño dentro de myArray y verificar el tipo de miembros a medida que los recorre.
fuente
Si necesita una estructura de datos asociativa que exponga su tamaño, mejor use un mapa en lugar de un objeto.
fuente
¿Qué tal algo como esto?
fuente
Si tenemos el hash
podemos obtener la longitud usando la longitud de las teclas, que es la longitud del hash:
fuente
fuente
var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
Si está utilizando AngularJS 1.x, puede hacer las cosas a la manera de AngularJS creando un filtro y utilizando el código de cualquiera de los otros ejemplos, como los siguientes:
Uso
En tu controlador:
O en tu opinión:
fuente
La forma más simple es así
donde myobject es el objeto de lo que quieres la longitud
fuente
Si no le importa admitir Internet Explorer 8 o inferior, puede obtener fácilmente el número de propiedades en un objeto aplicando los siguientes dos pasos:
Object.keys()
para obtener una matriz que contenga los nombres de solo aquellas propiedades que son enumerables oObject.getOwnPropertyNames()
si desea incluir también los nombres de propiedades que no son enumerables..length
propiedad de esa matriz.Si necesita hacer esto más de una vez, podría ajustar esta lógica en una función:
Cómo usar esta función particular:
Vea también este violín para una demostración.
fuente
Use
Object.keys(myObject).length
para obtener la longitud del objeto / matrizfuente
fuente
Una variación de algunos de los anteriores es:
Es una forma un poco más elegante de integrar hasOwnProp.
fuente
Aquí hay una versión diferente de la respuesta de James Cogan. En lugar de pasar un argumento, prototipo de la clase Object y hacer el código más limpio.
Ejemplo de jsfiddle: http://jsfiddle.net/qar4j/1/
fuente
Object.prototype
- mala idea.Simplemente puede usar
Object.keys(obj).length
en cualquier objeto para obtener su longitud. Object.keys devuelve una matriz que contiene todas las claves de objeto (propiedades) que pueden ser útiles para encontrar la longitud de ese objeto usando la longitud de la matriz correspondiente. Incluso puedes escribir una función para esto. Vamos a ser creativos y escribir un método para ello también (junto con una propiedad getter más conveniente):fuente
Siempre puede hacer
Object.getOwnPropertyNames(myObject).length
para obtener el mismo resultado[].length
que daría para una matriz normal.fuente
Object.keys()
devuelve una matriz que contiene los nombres de solo aquellas propiedades que son enumerables. Si desea una matriz con TODAS las propiedades, debe usarlaObject.getOwnPropertyNames()
en su lugar. Ver developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Podemos encontrar la longitud del objeto usando:
fuente
Un poco tarde para el juego, pero una buena manera de lograr esto (solo IE9 +) es definir un captador mágico en la propiedad de longitud:
Y puedes usarlo así:
Daría
1
.fuente
A continuación se muestra una versión de la respuesta de James Coglan en CoffeeScript para aquellos que han abandonado JavaScript directo :)
fuente
size++ for own key of obj
(own key
ser sintaxis de azúcar en CoffeeScript). UsarlohasOwnProperty
directamente desde el objeto es peligroso, ya que se rompe cuando el objeto realmente tiene dicha propiedad.