La implementación estándar de objetos ( Propiedades y métodos internos de objetos ES5.1 ) no requiere un Object
seguimiento de su número de claves / propiedades, por lo que no debe haber una forma estándar de determinar el tamaño de un Object
sin iterar explícita o implícitamente sobre sus claves.
Aquí están las alternativas más utilizadas:
1. Object.keys de ECMAScript ()
Object.keys(obj).length;
Funciona iterando internamente sobre las teclas para calcular una matriz temporal y devuelve su longitud.
- Pros : sintaxis legible y limpia. No se requiere biblioteca o código personalizado, excepto una cuña si el soporte nativo no está disponible
- Contras : sobrecarga de memoria debido a la creación de la matriz.
2. Soluciones basadas en bibliotecas
Muchos ejemplos basados en bibliotecas en otras partes de este tema son expresiones idiomáticas útiles en el contexto de su biblioteca. Sin embargo, desde el punto de vista del rendimiento, no hay nada que ganar en comparación con un código perfecto sin biblioteca, ya que todos esos métodos de biblioteca realmente encapsulan ya sea for-loop o ES5 Object.keys
(nativo o shimmed).
3. Optimizar un ciclo for
La parte más lenta de tal ciclo for es generalmente la .hasOwnProperty()
llamada, debido a la sobrecarga de la llamada de función. Entonces, cuando solo quiero la cantidad de entradas de un objeto JSON, simplemente salteo la .hasOwnProperty()
llamada si sé que ningún código se extendió ni se extenderá Object.prototype
.
De lo contrario, su código podría optimizarse ligeramente haciendo k
local ( var k
) y utilizando el operador de incremento de prefijo ( ++count
) en lugar de postfix.
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
Otra idea se basa en el almacenamiento en caché del hasOwnProperty
método:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
Si esto es más rápido o no en un entorno determinado es una cuestión de evaluación comparativa. Se puede esperar una ganancia de rendimiento muy limitada de todos modos.