PDA

Volledige versie bekijken : Custom object en sortering/terugvragen data


Par
%Europe/Berlin %832 %2005, 20:58
Voor een project heb ik een generieke XML parser geschreven; er zullen vast andere manieren zijn, maar het idee wat ik had is de data zo opslaan uit de XML dat het logisch terug te vragen is. XML en XSLT's werken bijv. met /persons/person/name als padverwijzing, ik heb in flash nu:
myObj['PERSONS']['PERSON1']['NAME'] en dat werkt heel prima.

Een voorbeeld van hoe het object gemaakt wordt volgt hieronder:

myObject = new Object;
myObject['PERSON1'] = new Object;
myObject['PERSON1']['NAME'] = "Debug";
myObject['PERSON2'] = new Object;
myObject['PERSON2']['NAME'] = "Par";
myObject['PERSON3'] = new Object;
myObject['PERSON3']['NAME'] = "WYSINWIG";

for (thisObject in myObject)
{
trace(thisObject);
}

Oftewel, een object dat weer meerdere objecten bevat. Het is net een array, maar net even anders; zover ik weet in ieder geval.

Als je deze code leest, lijkt het mij logisch dat de uitvoer van de trace zal zijn:
person1, person2, person3

Dat is niet het geval, ik krijg terug:
person3, person2, person1

Het lijkt dus wel of het als een stack werkt en het last in first out principe wordt toegepast.

Dit was totaal niet mijn bedoeling; ik wil de data gewoon in dezelfde volgorde hebben als het XML document.

Vragen zijn:
1. waarom geeft de for loop de objecten "omgekeerd" terug, is hier een specificatie van te vinden?

2. hoe krijg ik de volgorde wel weer normaal

Wellicht dat mijn werkwijze niet juist is, maar het zou prima werken wanneer flash de boel niet om zou draaien.

Ik heb gegoogled en rondgevraagd op #flash op Efnet, maar kennelijk is hier niet veel over bekend. Misschien dat hier iemand is die mij verder kan helpen.

Laiverd
%Europe/Berlin %852 %2005, 21:27
Waarom een for in loop de boel omgekeerd lijkt door te lopen zou ik niet weten maar metvar objs = new Array();
for (thisObject in myObject)
{
objs.push(thisObject);
}
objs.reverse()
trace(objs); Kun je de boel wel relatief makkelijk omdraaien.

John

Roenes
%Europe/Berlin %867 %2005, 21:49
Laiverd, op zich een goede oplossing maar dan is het hele object gebeuren wat overbodig. Dan kan hij het net zo goed meteen in een 2D array zetten...

En het is wel bekend dat een for...in loop van "achter" naar "voor" loopt. Hier kun je volgens mij niets aan doen. Je kunt misschien wel een while loop gebruiken hiervoor? Of een gewone for lus maar dan wordt het geheel wat minder dynamisch omdat je van een object niet het aantal sub-objecten kan opvragen.

Ben eigenlijk wel benieuwd of je de volgorde van de for...in loop kan beïnvloeden. Misschien kan dat met ASSetPropFlags? (of hoe je het ook schrijft) of is dat alleen voor het zichtbaar/onzichtbaar maken van items in een keten?

Laiverd
%Europe/Berlin %873 %2005, 21:57
... Dan kan hij het net zo goed meteen in een 2D array zetten...Ik denk dat dat misschien nog wel veel handiger is ;) Kun je er met een 'gewone' for loop doorheen; no hassle.

John

Roenes
%Europe/Berlin %876 %2005, 22:01
Klopt, maar aangezien Par de XSLT's (???) padverwijzing wil gebruiken zal 2D array waarschijnlijk geen optie zijn. Al zou dat wel mijn oplossing zijn :p

Par
%Europe/Berlin %106 %2005, 03:32
Bedankt voor jullie reacties :)

Het idee van "geen 2d/3d/watD" array is met reden. Een XML bestand is een boomstructuur, dus takken met bladeren.
Je weet van te voren niet precies welke data je krijgt, maar wel hoe het eruit ziet.

|
--|--
|--
--
--|--|--
|--|
|--
|--

poging tot boompje :P

Het voordeel van een array is dat deze al een aantal functies heeft; zoals sort etc. Een 'new Object' heeft niks.

Ik kwam op http://www.macromedia.com/devnet/mx/flash/extreme/extreme006.html een interessant artikel tegen.
Aangezien elk object leeg is, moet je het ff vertellen "wie de volgende is". Dan kan je geloof ik iets doen van:

do{
trace(tempNode.data);
tempNode = tempNode.next;
} while (tempNode != rootNode);

oftewel, in je new Object, ff .next opnemen wie de volgende is, en dan do/while loopen.

Heb het nog niet getest, beetje laat :D maar zal het morgen eens proberen.

Par
%Europe/Berlin %113 %2005, 03:43
Klopt, maar aangezien Par de XSLT's (???) padverwijzing wil gebruiken zal 2D array waarschijnlijk geen optie zijn. Al zou dat wel mijn oplossing zijn :p

XSLT's heeft te maken met Stylesheets voor XML documenten. Zoiets van, als je <persoon> tegenkomt, beeld het dan af als <div>{varValue}</div>.. Maar das verder niet zo belangrijk ;)

ik wou zoiets als myObject['Personen']['Persoon']['Naam'] = "Par"; en dat werkt :)

Roenes
%Europe/Berlin %369 %2005, 09:52
XSLT is voor xml dus gewoon wat css is voor html? :)

Par
%Europe/Berlin %790 %2005, 19:57
XSLT is voor xml dus gewoon wat css is voor html? :)

yup :)