2010-07-26 13 views
102

Estoy tratando de verificar la longitud aquí. Intento probado. ¿Se me escapa algo?Comprobando la longitud del objeto de diccionario

var dNames = {}; 
dNames = GetAllNames(); 

for (var i = 0, l = dName.length; i < l; i++) 
{ 
     alert("Name: " + dName[i].name); 
} 

dNames tiene pares de nombre/valor. Sé que dNames tiene valores en ese objeto, pero todavía se está salteando por completo y cuando aviso incluso dName.length obviamente no es así, así que no estoy seguro. Lo busqué en la web. No pude encontrar nada sobre esto.

+2

No hay propiedad de "longitud" en los objetos planos. Eso es algo que las instancias de Array tienen. – Pointy

+0

Ok, ¿alguien sabe la forma correcta o educada de otorgar la respuesta? Sé que a sberry realmente se le ocurrió "la respuesta", pero Meder fue capaz de explicarlo a un tipo intermedio de JS como yo. No quiero enfadar a nadie. – PositiveGuy

+0

Usted otorga la respuesta a la persona que la respuesta funcionó para usted. – KareemElashmawy

Respuesta

7
var c = {'a':'A', 'b':'B', 'c':'C'}; 
var count = 0; 
for (var i in c) { 
    if (c.hasOwnProperty(i)) count++; 
} 

alert(count); 
+0

bien, entonces tiene que repetir ... ¿no hay manera de hacerlo desde un objeto personalizado que tenga nombre/valores? – PositiveGuy

+2

No creo ** que exista. Asegúrese de marcar "hasOwnProperty" para detener la iteración hacia abajo en la cadena del prototipo y solo verificar las propiedades. – sberry

+0

Gracias ... soy más un tipo OOP, pero empezando a acostumbrarme a JS más. – PositiveGuy

1

Esta pregunta es confusa. Un objeto normal, {} no tiene una propiedad length a menos que tenga la intención de crear su propio constructor de funciones que genere objetos personalizados que sí lo tienen (en cuyo caso no especificó).

Lo que significa que debe obtener la "longitud" mediante una declaración for..in en el objeto, ya que length no está establecido, e incrementar un contador.

No estoy seguro de por qué necesita el length. ¿Está configurando manualmente 0 en el objeto o está confiando en claves de cadena personalizadas? por ejemplo, obj['foo'] = 'bar';. Si este último, de nuevo, ¿por qué la necesidad de longitud?

Editar # 1: ¿Por qué no puedes hacer esto?

list = [ {name:'john'}, {name:'bob'} ]; 

¿Luego iterar sobre la lista? El length ya está configurado.

+0

Entonces, una matriz tiene una propiedad de conteo ... ¿porque probablemente eso está integrado en el tipo nativo de JS? – PositiveGuy

+4

'[]' tiene 'longitud',' {} 'no. utilice un bucle 'for' con' length' para '[]' y un 'for..in' para' {} '. –

+1

Para responder a su pregunta, sí, es confuso porque no soy un tipo JS, soy un tipo C#. Así que necesitaba verificar la longitud de mi diccionario para comprobar si tenía algún objeto. Para el manejo regular de errores, supongo que solo verificaría null en un diccionario, pero solo quería ver cuántos devolvieron y se agregaron a mi diccionario. Así que el problema no era cómo iterar, solo ver cómo obtener el recuento que creía que podía hacer con un objeto de tipo de diccionario (nvp) por así decirlo. – PositiveGuy

0

contar y mostrar las teclas en un diccionario (se ejecutan en la consola):

o=[];count=0; for (i in topicNames) { ++count; o.push(count+": "+ i) } o.join("\n") 

Salida de ejemplo:

"1: Phase-out Left-hand 
2: Define All Top Level Taxonomies But Processes 
3: 987 
4: 16:00 
5: Identify suppliers" 

función de conteo simple:

function size_dict(d){c=0; for (i in d) ++c; return c} 
254

Lo que hago es el uso Object.keys() para devolver una lista de todas las claves y luego obtener la longitud de

Object.keys(dictionary).length 
+1

¡Justo lo que necesitaba! Cheers – Gesias

+11

FYI para los demás que aún soportan IE8: Sin dados. [link] (http://kangax.github.io/es5-compat-table/#Object.keys) –

+0

En Chrome 53, estoy viendo que Object.keys (diccionario) informa una longitud de 1 aunque es un diccionario vacío . Tiene una entrada llamada '$ type'. – user99999991

Cuestiones relacionadas