Como faço para contar os atributos de um object JavaScript?

Suponha que eu tenha o seguinte object em JavaScript:

var object = { "key1": "value1", "key2": "value2", "key3": "value3" }; 

Como descubro quantos valores existem no object?

Não há uma resposta fácil, porque o Object – do qual deriva todo object do JavaScript – inclui muitos atributos automaticamente, e o conjunto exato de atributos que você obtém depende do intérprete em particular e de qual código foi executado antes do seu. Então, de alguma forma você tem que separar os que você definiu daqueles que você tem “de graça”.

Aqui está um jeito:

 var foo = {"key1": "value1", "key2": "value2", "key3": "value3"}; Object.prototype.foobie = 'bletch'; // add property to foo that won't be counted var count = 0; for (var k in foo) { if (foo.hasOwnProperty(k)) { ++count; } } alert("Found " + count + " properties specific to foo"); 

A segunda linha mostra como outro código pode adicionar propriedades a todas as derivadas do Object . Se você remover a verificação hasOwnProperty() dentro do loop, a contagem de propriedades aumentará para pelo menos 4. Em uma página com outro JavaScript além desse código, ele poderá ser maior que 4, se esse outro código também modificar o protótipo Object .

Você pode fazer isso usando este código simples:

 Object.keys(myObject).length 

Use a biblioteca de sublinhados , muito útil: _.keys(obj).length .

  var miobj = [ {"padreid":"0", "sw":"0", "dtip":"UNO", "datos":[]}, {"padreid":"1", "sw":"0", "dtip":"DOS", "datos":[]} ]; alert(miobj.length) //=== 2 

mas

  alert(miobj[0].length) //=== undefined 

esta function é muito boa

 Object.prototype.count = function () { var count = 0; for(var prop in this) { if(this.hasOwnProperty(prop)) count = count + 1; } return count; } alert(miobj.count()) // === 2 alert(miobj[0].count()) // === 4 

Você pode iterar sobre o object para obter as chaves ou valores:

 function numKeys(obj) { var count = 0; for(var prop in obj) { count++; } return count; } 

Parece um “erro de ortografia”, mas só quero salientar que o seu exemplo é uma syntax inválida, deve ser

 var object = {"key1":"value1","key2":"value2","key3":"value3"}; 

Esta function faz uso da propriedade __count__ do Mozilla se ela estiver disponível, pois é mais rápida do que iterar sobre cada propriedade.

 function countProperties(obj) { var count = "__count__", hasOwnProp = Object.prototype.hasOwnProperty; if (typeof obj[count] === "number" && !hasOwnProp.call(obj, count)) { return obj[count]; } count = 0; for (var prop in obj) { if (hasOwnProp.call(obj, prop)) { count++; } } return count; }; countProperties({ "1": 2, "3": 4, "5": 6 }) === 3; 

EDIT: isso irá causar erros com jquery para acontecer, além de alguns outros inconvenientes. VOCÊ NÃO DEVE USAR : (talvez se alguém pudesse adicionar um método privado em vez de uma function de propriedade pública, isso seria OK, mas não tenha tempo agora). Comunidade wikied

não use:

Mesmo que o object do javascript por padrão não tenha a function count, as classs são facilmente extensíveis, e pode-se adicionar a si mesmo:

 Object.prototype.count = function () { var count = 0; for(var prop in this) { if(this.hasOwnProperty(prop)) count = count + 1; } return count; } 

Então, depois disso, pode-se executar

 var object = {'key1': 'val1', 'key2':'val2', 'key3':'val3'}; console.log(object.count()); // 3 

Como conclusão, se você deseja contar a funcionalidade em objects, é necessário copiar o código do bloco de códigos 1 e colá-lo no início do tempo de execução (antes de chamar a contagem).

Deixe-me saber se isso funciona para você!

Atenciosamente, Pedro

Para aqueles que lerem esta questão / respostas, aqui está uma implementação de JavaScript da coleção Dictionary muito semelhante à funcionalidade do .NET: JavaScript Dictionary

Embora não seja um “object verdadeiro”, você sempre pode fazer algo assim:

 var foo = [ {Key1: "key1"}, {Key2: "key2"}, {Key3: "key3"} ]; alert(foo.length); // === 3