Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Spyder.RV

[Resolvido] Como contar elementos de um objeto literal?

Recommended Posts

Pessoal, como faço para contar os elementos de um objeto literal?

 

var objeto = {
  ID: 10,
  nome: "Fulano de tal",
  endereco: "Endereço"
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Contar como assim? Exibir o total ou iterar?

 

Se for exibir o total:

obj.length

 

Iterar:

for( var prop in obj ) {
   console.log( prop, obj, obj[prop] );
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

@JCMais

 

Nem todos os objetos têm a propriedade length. Pode-se criar um array, e aí sim usá-la:

 

var objeto = {
  ID: 10,
  nome: "Fulano de tal",
  endereco: "Endereço"
}

console.log(Object.getOwnPropertyNames(objeto).length);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa @guidjos, você tem razão, me equivoquei. :P

 

Pode-se também utilizar o metódo Object.keys() presente me navegadores com suporte à API do HTML5, para navegadores antigos pode-se usar o seguinte polyfill:

 

if (!Object.keys) {
 Object.keys = (function () {
   var hasOwnProperty = Object.prototype.hasOwnProperty,
       hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
       dontEnums = [
         'toString',
         'toLocaleString',
         'valueOf',
         'hasOwnProperty',
         'isPrototypeOf',
         'propertyIsEnumerable',
         'constructor'
       ],
       dontEnumsLength = dontEnums.length

   return function (obj) {
     if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object')

     var result = []

     for (var prop in obj) {
       if (hasOwnProperty.call(obj, prop)) result.push(prop)
     }

     if (hasDontEnumBug) {
       for (var i=0; i < dontEnumsLength; i++) {
         if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i])
       }
     }
     return result
   }
 })()
};

 

:seta: MDN - Object.keys

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, valeu pelas dicas... situações interessantes!

 

Mas aí começa a cair na velha questão de ficar testando browser por browser e vai ficando inchado de código pra pouca coisa...

 

o que eu quero é somente validar se um objeto literal tem conteúdo para manipular e pensei em contar seus elementos justamente para isso, pois tentei fazer um teste simples e não deu, olhem só:

 

var minhafuncao = function(objeto){

  if( objeto === {}  || typeof(objeto) === 'undefined' ){
 	console.log("deixa quieto");
 	return false;
  }

  console.log("continua o código usando as propriedades do objeto");
}

// tipos de envios que podem ocorrer
minhafuncao( {} );
minhafuncao(  );
minhafuncao( {id: 10, nome: "Wemerson"} );

 

Não sei por que cargas d'água eu passo {} como parâmetro e depois na hora de testar não dá... o que é mais estranho é que o valor dele é {} com certeza...

 

Até mesmo se eu setar o valor dele dentro da função para {} não dá... é como se o valor não fosse {}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver seguindo as instruções do JCMAIS sobre como iterar com os elementos, mas usando o $.each do jquery... testei no IE7 e 8...

 

 

var literalCount = function(literal){
  var c = 0;
  $.each(literal, function(){ c++; });
  return c;
};


var objeto = {
  id: 10,
  nome: "Fulano de tal",
  endereco: "Rual tal"
};

console.log( "O objeto possui: " + literalCount( objeto ) + " elementos" );

 

Pra mim tá valendo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.