Eu tenho um objeto JavaScript, existe uma maneira de prática recomendada aceita ou incorporada para obter o comprimento desse objeto?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
javascript
javascript-objects
Gareth Simpson
fonte
fonte
Object.keys(obj).length
Respostas:
A resposta mais robusta (ou seja, que captura a intenção do que você está tentando fazer enquanto causa o menor número de erros) seria:
Existe um tipo de convenção no JavaScript que você não adiciona itens ao Object.prototype , porque ele pode quebrar as enumerações em várias bibliotecas. Adicionar métodos ao Object geralmente é seguro, no entanto.
Aqui está uma atualização a partir de 2016 e implantação generalizada do ES5 e além. Para o IE9 + e todos os outros navegadores modernos compatíveis com ES5 +, você pode usar
Object.keys()
o código acima:Isso não precisa modificar nenhum protótipo existente, pois
Object.keys()
agora está incorporado.Editar : os objetos podem ter propriedades simbólicas que não podem ser retornadas pelo método Object.key. Portanto, a resposta seria incompleta sem mencioná-los.
O tipo de símbolo foi adicionado ao idioma para criar identificadores exclusivos para propriedades do objeto. O principal benefício do tipo Symbol é a prevenção de substituições.
Object.keys
ouObject.getOwnPropertyNames
não funciona para propriedades simbólicas. Para devolvê-los, você precisa usarObject.getOwnPropertySymbols
.fonte
Object.keys(obj).length
Se você sabe que não precisa se preocupar com
hasOwnProperty
verificações, faça isso de maneira muito simples:fonte
Atualizado : se você estiver usando o Underscore.js (recomendado, é leve!), Poderá fazer
Caso contrário , e você não quer mexer nas propriedades do objeto por qualquer motivo, e já está usando o jQuery, um plug-in é igualmente acessível:
fonte
_.size()
foi a solução perfeita para o meu projeto Meteor , que tem suporte a underscore.js.Aqui está a solução com mais navegadores.
Isso é melhor do que a resposta aceita porque usa Object.keys nativo, se existir. Portanto, é o mais rápido para todos os navegadores modernos.
fonte
Object.keys()
retorna uma matriz que contém os nomes apenas das propriedades enumeráveis. Se você deseja uma matriz com TODAS as propriedades, deve usarObject.getOwnPropertyNames()
. Veja developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Não sou especialista em JavaScript, mas parece que você precisaria percorrer os elementos e contá-los, pois Object não possui um método de comprimento:
@palmsey: Para ser justo com o OP, a documentação JavaScript realmente se refere explicitamente ao uso de variáveis do tipo Object dessa maneira como "matrizes associativas".
fonte
Esse método obtém todos os nomes de propriedades do seu objeto em uma matriz, para que você possa obter o comprimento dessa matriz igual ao comprimento das chaves do seu objeto.
fonte
Para não mexer com o protótipo ou outro código, você pode criar e estender seu próprio objeto:
Se você sempre usar o método add, a propriedade length estará correta. Se você estiver preocupado com o fato de você ou outras pessoas esquecerem de usá-la, adicione o contador de propriedades que outras pessoas postaram no método length também.
Claro, você sempre pode substituir os métodos. Mas mesmo se você o fizer, seu código provavelmente falhará notavelmente, facilitando a depuração. ;)
fonte
Veja como e não se esqueça de verificar se a propriedade não está na cadeia de protótipos:
fonte
Basta usar isso para obter
length
:fonte
myArray
Aqui está uma solução completamente diferente que funcionará apenas em navegadores mais modernos (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+)
Veja jsFiddle
Configure sua classe Matriz Associativa
Agora você pode usar esse código da seguinte maneira ...
fonte
length
propriedade, qualquer código que a usasse teria que garantir que não tentasse armazenar contralength
, mas acho que seria o mesmo se fosse uma matriz padrão também. SubstituirhasOwnProperty
qualquer objeto provavelmente produziria um resultado indesejado.Isso funciona para mim:
fonte
Em alguns casos, é melhor armazenar apenas o tamanho em uma variável separada. Especialmente, se você estiver adicionando à matriz por um elemento em um só lugar e puder aumentar facilmente o tamanho. Obviamente, funcionaria muito mais rápido se você precisar verificar o tamanho com frequência.
fonte
Usar:
fonte
Para ser justo com @palmsey, ele estava certo, eles não são matrizes associativas, são definitivamente objetos :) - fazendo o trabalho de uma matriz associativa. Mas no que diz respeito ao ponto mais amplo, você definitivamente parece ter o direito de acordo com este artigo bastante interessante que eu descobri:
"Matrizes associativas" do JavaScript consideradas prejudiciais
Mas, de acordo com tudo isso, a resposta aceita não é uma prática ruim?
Se alguma outra coisa foi adicionada ao objeto .prototype, o código sugerido falhará:
Eu não acho que essa resposta deva ser aceita, pois não pode ser confiável funcionar se você tiver outro código em execução no mesmo contexto de execução. Para fazer isso de maneira robusta, certamente você precisará definir o método de tamanho no myArray e verificar o tipo de membros à medida que itera.
fonte
Se você precisar de uma estrutura de dados associativa que exponha seu tamanho, use melhor um mapa em vez de um objeto.
fonte
Que tal algo assim -
fonte
Se tivermos o hash
podemos obter o comprimento usando o comprimento das chaves, que é o comprimento do hash:
fonte
fonte
var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
Se você estiver usando o AngularJS 1.x, poderá fazer as coisas da maneira AngularJS criando um filtro e usando o código de qualquer um dos outros exemplos, como os seguintes:
Uso
No seu controlador:
Ou na sua opinião:
fonte
A maneira mais simples é assim
onde myobject é o objeto do que você quer o comprimento
fonte
Se você não se preocupa em oferecer suporte ao Internet Explorer 8 ou inferior, pode obter facilmente o número de propriedades em um objeto aplicando as duas etapas a seguir:
Object.keys()
para obter uma matriz que contenha apenas os nomes das propriedades enumeráveis ouObject.getOwnPropertyNames()
se você também quiser incluir os nomes das propriedades não enumeráveis..length
propriedade dessa matriz.Se você precisar fazer isso mais de uma vez, poderá envolver essa lógica em uma função:
Como usar esta função específica:
Veja também este Fiddle para uma demonstração.
fonte
Use
Object.keys(myObject).length
para obter o comprimento do objeto / matrizfonte
fonte
Uma variação em alguns dos itens acima é:
É uma maneira um pouco mais elegante de integrar o hasOwnProp.
fonte
Aqui está uma versão diferente da resposta de James Cogan. Em vez de passar um argumento, apenas protótipo da classe Object e torne o código mais limpo.
Exemplo de jsfiddle: http://jsfiddle.net/qar4j/1/
fonte
Object.prototype
- péssima ideia.Você pode simplesmente usar
Object.keys(obj).length
em qualquer objeto para obter seu comprimento. Object.keys retorna uma matriz contendo todas as chaves (propriedades) do objeto, que podem ser úteis para encontrar o comprimento desse objeto usando o comprimento da matriz correspondente. Você pode até escrever uma função para isso. Vamos ser criativos e escrever um método para ele também (junto com uma propriedade getter mais conveniente):fonte
Você sempre pode fazer
Object.getOwnPropertyNames(myObject).length
para obter o mesmo resultado[].length
que daria para a matriz normal.fonte
Object.keys()
retorna uma matriz que contém os nomes apenas das propriedades enumeráveis. Se você deseja uma matriz com TODAS as propriedades, deve usarObject.getOwnPropertyNames()
. Veja developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Podemos encontrar o comprimento do objeto usando:
fonte
Um pouco tarde para o jogo, mas uma boa maneira de conseguir isso (apenas no IE9 +) é definir um getter mágico na propriedade length:
E você pode usá-lo assim:
Daria
1
.fonte
Abaixo está uma versão da resposta de James Coglan no CoffeeScript para aqueles que abandonaram o JavaScript direto :)
fonte
size++ for own key of obj
(own key
sendo açúcar de sintaxe no CoffeeScript). UsarhasOwnProperty
diretamente do objeto é perigoso, pois quebra quando o objeto realmente possui essa propriedade.