2008-11-04 15 views

Respuesta

-1

Esto funcionará con JSON. No se ha probado mucho:

<style> 
.tree { 
    margin-left:5px; 
} 
</style> 
<div id='out'></div> 
<script type="text/javascript"> 
data = {"feep":{"bar":{"baz":"37628","quux":{"a":"179","b":"7"}},"foo":"1025"},"Bleh":"1234"} 
$('out').innerHTML = renderJSON(data) 

function renderJSON(obj) { 
    var keys = [] 
    var retValue = "" 
    for (var key in obj) { 
     //$('out').innerHTML = $('out').innerHTML +"<br />" + key + ", " + obj[key]  
     if(typeof obj[key] == 'object') { 
      retValue += "<div class='tree'>" + key      
      retValue += renderJSON(obj[key]) 
      retValue += "</div>" 
     } 
     else { 
      retValue += "<div class='tree'>" + key + " = " + obj[key] + "</div>" 
     } 

     keys.push(key) 
    } 
    return retValue 

} 
</script> 
0

Cuando decimos "construidos en propiedades", que establecen de propiedad está exactamente hablando?

De Douglas Crockford 'JavaScript - The Good Parts':

El comunicado en hacer un loop sobre todos de los nombres de las propiedades de un objeto. La enumeración incluirá todas las propiedades, incluyendo funciones y propiedades prototipo que podría no estar interesados ​​en lo que es necesaria para filtrar los valores que no desea. Los filtros más comunes son el método hasOwnProperty y usando typeof para excluir funciones:

var name; 
for (name in another_stooge) 
{ 
    if (typeof another_stooge[name] !== 'function') { 
     document.writeln(name + ': ' + another_stooge[name]); 
    } 
} 
+0

Mi caso de uso particular enumera los métodos incorporados para Array.prototype. Desde la referencia de JavaScript de MDC: "A for ... in loop no itera sobre las propiedades integradas". Lo que confirma un bucle simple sobre Array.prototype. –

5

La respuesta es no. No puede enumerar propiedades que no son enumerables. Sin embargo, hay al menos dos formas de evitar esto.

La primera es generar toda la combinación posible de caracteres para usar como nombres de propiedades de prueba (piense: a, b, c, ... aa, ab, ac, ad, ...). Dado que la comunidad de estándares es famosa por encontrar nombres de método realmente largos (getElementsByTagNames, propertyIsEnumerable), este método requerirá un poco de paciencia. :-)

Otro enfoque es probar las propiedades nativas conocidas de alguna lista predefinida.

Por ejemplo: Para una array le prueba para todas las propiedades nativas conocidas de Function.prototype:

prototype caller constructor length name apply call toSource toString valueOf toLocaleString 

... y cosas heredadas de Object.prototype:

__defineGetter__ __defineSetter__ hasOwnProperty isPrototypeOf __lookupGetter__ 
__lookupSetter__ __noSuchMethod__ propertyIsEnumerable unwatch watch 

... y cosas heredadas de Array:

index input pop push reverse shift sort splice unshift concat join slice indexOf lastIndexOf 
filter forEach every map some reduce reduceRight 

..y por último, y, opcionalmente, todas las propiedades enumerables del objeto que se está probando:

for (var property in myArrayObject) myPossibleProperties.push(property); 

A continuación, ser capaz de probar cada uno de esos para ver si están presentes en la instancia del objeto.

Esto no revelará miembros no enumerables desconocidos (no documentados o establecidos por otros scripts), pero le permitirá enumerar qué propiedades nativas están disponibles.

Encontré la información de Array propiedades nativas en Mozilla Developer Center y MSDN.

17

Me doy cuenta de que esta pregunta tiene tres años, pero ahora, con ES5, es posible :

>>> Object.getOwnPropertyNames(Object)

["prototype", "getPrototypeOf", "getOwnPropertyDescriptor", "keys", "defineProperty", "defineProperties", "create", "getOwnPropertyNames", "isExtensible", "preventExtensions", "freeze", "isFrozen", "seal", "isSealed", "length", "arity", "name", "arguments", "caller"]

+3

Para aclarar un poco, Object.getOwnPropertyNames (Array) proporciona las propiedades integradas para Array. – forforf

Cuestiones relacionadas