Existe uma maneira de obter (de algum lugar) o número de elementos em um objeto javascript? (isto é, complexidade de tempo constante).
Não consigo encontrar uma propriedade ou método que recupere essas informações. Até agora, só consigo pensar em fazer uma iteração por toda a coleção, mas isso é tempo linear.
É estranho que não haja acesso direto ao tamanho do objeto, não acha.
EDIT:
Estou falando sobre o Object
objeto (não objetos em geral):
var obj = new Object ;
javascript
collections
elements
javascript-objects
Liberta-te
fonte
fonte
Respostas:
Embora as implementações de JS possam acompanhar esse valor internamente, não há uma maneira padrão de obtê-lo.
No passado, a variante Javascript da Mozilla expôs o não padrão
__count__
, mas foi removido com a versão 1.8.5.Para scripts de navegadores diferentes, você fica preso em iterar explicitamente as propriedades e verificar
hasOwnProperty()
:No caso de implementações compatíveis com ECMAScript 5, isso também pode ser escrito como (Kudos to Avi Flax )
Lembre-se de que você também perderá propriedades que não são enumeráveis (por exemplo, uma matriz
length
).Se você estiver usando um framework como jQuery, Prototype, Mootools, $ Whatever-the-newest-hype, verifique se eles vêm com suas próprias APIs de coleções, o que pode ser uma solução melhor para o seu problema do que usar objetos JS nativos.
fonte
__count__
sumiu :(hasOwnProperty()
?Para fazer isso em qualquer ambiente compatível com ES5
(Suporte de navegador a partir daqui )
(Doc on Object.keys aqui , inclui o método que você pode adicionar a navegadores não ECMA5)
fonte
se você já estiver usando jQuery em sua construção, faça o seguinte:
Funciona bem para mim em objetos, e eu já tinha o jQuery como dependência.
fonte
fonte
AFAIK, não há como fazer isso de forma confiável, a menos que você mude para um array. O que, honestamente, não parece estranho - parece bastante direto para mim que as matrizes são contáveis, e os objetos não.
Provavelmente, o mais perto que você chegará é algo assim
Mas isso cria problemas, ou pelo menos perguntas. Todas as propriedades criadas pelo usuário são contadas, incluindo a própria função _length! E embora neste exemplo simples você possa evitá-lo usando apenas uma função normal, isso não significa que você pode impedir que outros scripts façam isso. Então, o que você faz? Ignorar propriedades da função?
No final, acho que você provavelmente deveria abandonar a ideia de tornar seus objetos contáveis e descobrir outra maneira de fazer o que quer que esteja fazendo.
fonte
O conceito de número / comprimento / dimensionalidade não faz sentido para um objeto, e precisar dele sugere que você realmente quer um Array para mim.
Edit: Indicou para mim que você quer um O (1) para isso. Até onde sei, não existe tal forma, receio.
fonte