2008-11-04 16 views
6

Czy istnieje sposób, aby pętla nad obiektami JavaScript obiektu wbudowanego?Właściwości obiektu Lista obiektów

dla ... w przybliżeniu do miejsca, do którego chcę się udać, ale "pętla A for ... in nie wykonuje iteracji po właściwościach wbudowanych".

+0

mógłbyś stringify swój obiekt do JSON i analizować wynik? – starbeamrainbowlabs

Odpowiedz

-1

To będzie działać z JSON. To nie zostało przetestowane wiele:

<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

Kiedy mówisz „zbudowany w nieruchomości”, które określają właściwości są dokładnie chodzi?

Od Douglas Crockforda na 'JavaScript - The Good Parts':

w oświadczeniu można pętli nad wszystkimi z nazw właściwości w obiekcie. Wyliczenie obejmie wszystkie funkcje - łącznie z funkcjami i właściwościami prototypowymi , których możesz nie interesować, aby -nie trzeba było odfiltrować wartości, których nie chcesz, abyś nie odfiltrował wartości . Najczęstsze filtry to metoda hasOwnProperty i użyciu typeof wykluczyć funkcje:

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

Moim szczególnym przypadkiem użycia jest wyliczanie za pomocą wbudowanych metod dla obiektu Array.prototype. Z podstawowego odwołania do javascript MDC: "Pętla A for ... in nie wykonuje iteracji po właściwościach wbudowanych". Która prosta pętla nad Array.prototype potwierdza. –

5

odpowiedź brzmi: nie. Nie można wyliczyć właściwości, które nie są przeliczalne. Istnieją jednak co najmniej dwa sposoby obejścia tego problemu.

Pierwszym z nich jest wygenerowanie wszystkich możliwych kombinacji znaków, które będą używane jako nazwy właściwości testowych (pomyśl: a, b, c, ... aa, ab, ac, ad, ...). Biorąc pod uwagę, że społeczność standardów słynie z wymyślania naprawdę długich nazw metod (getElementsByTagNames, propertyIsEnumerable), ta metoda wymaga trochę cierpliwości. :-)

Innym podejściem jest przetestowanie znanych właściwości natywnych z pewnej predefiniowanej listy.

Na przykład: Dla array by przetestować dla wszystkich znanych rodzimych właściwości Function.prototype:

prototype caller constructor length name apply call toSource toString valueOf toLocaleString 

... i rzeczy odziedziczonych Object.prototype:

__defineGetter__ __defineSetter__ hasOwnProperty isPrototypeOf __lookupGetter__ 
__lookupSetter__ __noSuchMethod__ propertyIsEnumerable unwatch watch 

... i rzeczy odziedziczonych od Array:

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

..i wreszcie, i ewentualnie, każda nieruchomość przeliczalny obiektu testujesz:

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

Będziesz wtedy mógł przetestować każdy z tych, aby sprawdzić, czy są one obecne na instancji obiektu.

To nie ujawni nieznanych członków, których nie można wyliczyć (nieudokumentowanych lub ustawionych przez inne skrypty), ale pozwoli ci wyświetlić listę właściwości natywnych.

Znalazłem informacje o natywnych właściwościach Array na Mozilla Developer Center i MSDN.

17

Zdaję sobie sprawę, kwestia ta ma trzy lata, ale teraz, z ES5, możliwe jest :

>>> Object.getOwnPropertyNames(Object)

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

+3

Aby wyjaśnić nieco, Object.getOwnPropertyNames (Array) zapewnia wbudowane właściwości Array. – forforf