A implementação padrão de Objeto ( Propriedades e Métodos Internos do Objeto ES5.1 ) não exige que um Object
rastreie seu número de chaves / propriedades; portanto, não deve haver uma maneira padrão de determinar o tamanho de um objeto.Object
sem iterar explícita ou implicitamente suas chaves.
Então, aqui estão as alternativas mais usadas:
1. Object.keys do ECMAScript ()
Object.keys(obj).length;
Trabalha iterando internamente as chaves para calcular uma matriz temporária e retorna seu comprimento.
- Prós - sintaxe legível e limpa. Nenhuma biblioteca ou código personalizado necessário, exceto um calço, se o suporte nativo estiver indisponível
- Contras - sobrecarga de memória devido à criação da matriz.
2. Soluções baseadas em bibliotecas
Muitos exemplos baseados em bibliotecas em outras partes deste tópico são expressões úteis no contexto de sua biblioteca. Do ponto de vista do desempenho, no entanto, não há nada a ganhar em comparação com um código sem biblioteca perfeito, pois todos esses métodos de biblioteca realmente encapsulam um loop for ou ES5 Object.keys
(nativo ou shimmed).
3. Otimizando um loop for
A parte mais lenta desse loop for geralmente é a .hasOwnProperty()
chamada, devido à sobrecarga da chamada de função. Portanto, quando eu apenas quero o número de entradas de um objeto JSON, apenas pulo a .hasOwnProperty()
chamada se souber que nenhum código foi nem será estendido Object.prototype
.
Caso contrário, seu código poderá ser otimizado levemente, tornando k
local ( var k
) e usando o operador prefix-increment ( ++count
) em vez do postfix.
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
Outra idéia depende do armazenamento em cache do hasOwnProperty
método:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
Se isso é mais rápido ou não em um determinado ambiente, é uma questão de benchmarking. Um ganho de desempenho muito limitado pode ser esperado de qualquer maneira.