¿Hay alguna manera de obtener (desde algún lugar) la cantidad de elementos en un objeto javascript? (es decir, complejidad en tiempo constante).
No puedo encontrar una propiedad o método que recupere esa información. Hasta ahora solo puedo pensar en hacer una iteración a través de toda la colección, pero eso es tiempo lineal.
Es extraño que no haya acceso directo al tamaño del objeto, ¿no crees?
EDITAR:
estoy hablando del Object
objeto (no de los objetos en general):
var obj = new Object ;
javascript
collections
elements
javascript-objects
Liberarse
fuente
fuente
Respuestas:
Aunque las implementaciones de JS pueden realizar un seguimiento de dicho valor internamente, no existe una forma estándar de obtenerlo.
En el pasado, la variante de Javascript de Mozilla expuso el no estándar
__count__
, pero se ha eliminado con la versión 1.8.5.Para las secuencias de comandos entre navegadores, está atrapado en iterar explícitamente sobre las propiedades y verificar
hasOwnProperty()
:En el caso de implementaciones compatibles con ECMAScript 5, esto también se puede escribir como (Felicitaciones a Avi Flax )
Tenga en cuenta que también perderá propiedades que no se puedan enumerar (por ejemplo, una matriz
length
).Si está utilizando un marco como jQuery, Prototype, Mootools, $ cualquiera que sea el bombo más nuevo, verifique si vienen con su propia API de colecciones, que podría ser una mejor solución a su problema que usar objetos JS nativos.
fuente
__count__
se ha ido :(hasOwnProperty()
?Para hacer esto en cualquier entorno compatible con ES5
(Soporte del navegador desde aquí )
(Doc sobre Object.keys aquí , incluye un método que puede agregar a navegadores que no son ECMA5)
fuente
si ya está usando jQuery en su compilación, simplemente haga esto:
Funciona muy bien para mí en objetos, y ya tenía jQuery como dependencia.
fuente
fuente
AFAIK, no hay forma de hacer esto de manera confiable, a menos que cambie a una matriz. Lo cual, honestamente, no parece extraño, me parece bastante sencillo que las matrices son contables y los objetos no.
Probablemente lo más cerca que estarás es algo como esto
Pero esto crea problemas, o al menos preguntas. Se cuentan todas las propiedades creadas por el usuario, incluida la función _length. Y aunque en este ejemplo simple podría evitarlo simplemente usando una función normal, eso no significa que pueda evitar que otros scripts hagan esto. ¿Entonces, Qué haces? ¿Ignorar las propiedades de la función?
Al final, creo que probablemente deberías deshacerte de la idea de hacer que tus objetos sean contables y encontrar otra forma de hacer lo que sea que estés haciendo.
fuente
El concepto de número / longitud / dimensionalidad realmente no tiene sentido para un Objeto, y necesitarlo sugiere que realmente quieres un Array para mí.
Editar: Me señaló que desea una O (1) para esto. Que yo sepa, me temo que no existe tal forma.
fuente