Cómo contar eficientemente la cantidad de claves/propiedades de un objeto en JavaScript

Resuelto mjs asked hace 16 años • 19 respuestas

¿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).

mjs avatar Sep 24 '08 15:09 mjs
Aceptado

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)
Avi Flax avatar Feb 03 '2011 17:02 Avi Flax

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;
Renaat De Muynck avatar Apr 15 '2011 10:04 Renaat De Muynck

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.

studgeek avatar May 16 '2011 15:05 studgeek

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.

Steve Cooper avatar Oct 21 '2019 18:10 Steve Cooper