Cómo contar eficientemente la cantidad de claves/propiedades de un objeto en JavaScript
¿Cuál es la forma más rápida de contar el número de claves/propiedades de un objeto? ¿Es posible hacer esto sin iterar sobre el objeto? Es decir, sin hacer:
var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) ++count;
(Firefox proporcionó una __count__
propiedad mágica, pero se eliminó en algún momento alrededor de la versión 4).
Para hacer esto en cualquier entorno compatible con ES5 , como Node.js , Chrome, Internet Explorer 9+ , Firefox 4+ o Safari 5+:
Object.keys(obj).length
- Compatibilidad del navegador
- Documentación de Object.keys (incluye un método que puede agregar a navegadores que no sean ES5)
Podrías usar este código:
if (!Object.keys) {
Object.keys = function (obj) {
var keys = [],
k;
for (k in obj) {
if (Object.prototype.hasOwnProperty.call(obj, k)) {
keys.push(k);
}
}
return keys;
};
}
Entonces también puedes usar esto en navegadores más antiguos:
var len = Object.keys(obj).length;
Si está utilizando Underscore.js, puede usar _.size ( gracias douwe ):
_.size(obj)
Alternativamente, también puedes usar _.keys , lo que podría resultar más claro para algunos:
_.keys(obj).length
Recomiendo ampliamente Underscore.js. Es una biblioteca completa para hacer muchas cosas básicas. Siempre que sea posible, coinciden con ECMAScript 5 y difieren de la implementación nativa.
De lo contrario, apoyo la respuesta de Avi Flax . Lo edité para agregar un enlace a la documentación de MDC que incluye el método claves() que puede agregar a navegadores que no sean ECMAScript 5.
A continuación se muestran algunas pruebas de rendimiento para tres métodos;
https://jsperf.com/obtener-el-número-de-claves-en-un-objeto
Objeto.claves().longitud
20.735 operaciones por segundo
Es muy simple, compatible y se ejecuta rápido pero costoso, porque crea una nueva serie de claves, que luego se desechan.
return Object.keys(objectToRead).length;
Recorre las teclas
15.734 operaciones por segundo
let size=0;
for(let k in objectToRead) {
size++
}
return size;
Es un poco más lento, pero no se acerca al uso de memoria, por lo que probablemente sea mejor si está interesado en optimizarlo para dispositivos móviles u otras máquinas pequeñas.
Usando mapa en lugar de objeto
953.839.338 operaciones por segundo
return mapToRead.size;
Básicamente, Map rastrea su propio tamaño, por lo que solo devolvemos un campo numérico. Es mucho, mucho más rápido que cualquier otro método. Si tienes el control del objeto, conviértelo en mapas.