03. juni 2008 - 14:57Der er
25 kommentarer og 1 løsning
Problemer med arrays
Hej Eksperter,
Jeg har et kombineret ASP og JavaScript der genererer en drop down menu ud fra en tabel i en database. Tabellen indeholder 2 værdier: Side: Id'et på den side menupunktet skal linke til. Underside: Id'et på den der er en del af menupunktets undermenu.
Som det er nu, tilføjer jeg værdier til et array, hvor placeringen er bestemt ud fra 'Side'. Dette giver dog et problem da arrayet således ikke længere er fortløbende.
Er det muligt at definere et array i JavaScript der IKKE er fortløbende?
Jeg har det samme, men det script der genererer menustrukturen kan ikke håndtere spring mellem placeringerne i arrayet. Jeg tænker at det er nemmere at ændre arrayet til en anden form for liste/array, end at skulle ændre i 600 linjers JavaScript til generering af menustrukturen.
Det er bygget op således at hvert menupunkt har en mouseover funktion der indeholder værdien fra 'Side' (se første post), hvor scriptet så viser den (under-)menu, den har opbygget og lagret i arrayet, ud fra den værdi funktionen får med ind.
Har lige prøvet det, og kan ikke få det til at virke.
Jeg skal ærligt indrømme at jeg ikke har 110% indsigt i scriptet, da det er en demo jeg har hentet online. Jeg har dog fundet ud af hvilke værdier jeg skal ændre for at opbygge menuen.
Hvis jeg nu smider kildekoden til de 3 filer herind, kan du så kigge på det og evt. finde en løsning, hvis der er en?
mireigi>> Lige p.t. kan jeg ikke overskue at skulle regne 600 linjer kode ud og finde de rigtige steder at rette, desværre. =) frand>> Er du sikker på det? ^o) Altså det kan godt være, at det i virkeligheden tolkes som typen object, men det burde være hip som hap i JS, da den betragter de 2 ens, eller hvad?
#frand: Jeg har prøvet det du foreslår, men det ændrer stadig ikke på noget. Menuer der ligger uden for den fortløbende arraystruktur bliver ikke vist.
Ja, det er et problem. Jeg kan se, at den navngiver menu div'erne ud fra currentMenuNo, som tæller én op for hver menu man tilføjer. Så der må ikke være huller.
Ja, det var bl.a. fra den artikel, at jeg havde mit udsagn. F.eks. fra linjen: "I laget lige under JS-laget er den data-konstruktion, vi kalder et 'array' - og den konstruktion, vi kalder et 'object' to repræsentationer for én og samme data-konstruktion."
eller:
"Da array og object som sagt er det samme underliggende data-objekt, kan vi endda kalde med array- eller dot-notation ved både associative arrays og objects."
Jeg fandt en løsning på mit problem. Jeg gemmer to ekstra variable i databasen, hvor den ene er fortløbende og bruges til menuerne mens den anden bruges som relation mellem menuerne.
Frand og w13, hvis I smider et svar får I noget point.
Min artikel om arrays og objects bør opdateres. Man bør undgå konstruktionen 'associativt array' i JavaScript og i stedet anvende et object.
Det 'associative array' er i modsætning til andre sprog ikke defineret i JS, men er en uoverlagt sideeffekt af den måde, JS' egne objekter (herunder Array) er konstrueret på.
Man kan således bruge ethvert JS-objekt på samme måde: var o = new Date(); o["olebole"] = "bruger"; alert(o["olebole"]);
- eller: var o = new RegExp(); o["olebole"] = "bruger"; alert(o["olebole"]);
- eller: var o = new String(); o["olebole"] = "bruger"; alert(o["olebole"]);
- osv, osv.
Faktisk advares der i den officielle JS-reference mod at bruge Array som associativt array. I stedet rådes til brugen af Object object =)
frand >> Du tager nu også fejl ... tingene er en anelse mere komplekse. JS' Array-objekt er internt et ganske almindeligt JS-object, der har fået 'påklistret' lidt metoder og en enkelt property. I virkeligheden er et JS-array ikke talindekseret, men strengindekseret ;o)
Test f.eks. koden:
<script type="text/javascript"> var a = new Array("en", "to", "tre", "fire", "fem"); for (var x in a) { alert(x + " => " + a[x] + "\n" + (typeof x) + " :: " + (typeof a[x])) } </script>
Ja, vel fordi javascript genkender strengen som et tal. Ligesom alert("3"*2); viser 6.
Min pointe var bare, at i det øjeblik index ikke er et nummer, hvad enten du angiver det som en streng eller en integer, så bruger du ikke array-objektet som et "array".
"Ja, vel fordi javascript genkender strengen som et tal. Ligesom alert("3"*2); viser 6." >> Nej, det er fordi, JavaScript 'oversætter' tallet i de square brackets til en streng ved et array. Internt er array'et jo et objekt, og dér er tallet blevet ændret til en streng, så det er anvendeligt som property.
- og derfor er din pointe stadig ikke korrekt. Der kan ikke herske tvivl om, at "123" er en streng, og på trods af, at index ikke er et nummer, fungerer denne kode fint:
var a = []; var sMyString = "123"; alert(typeof sMyString); // returnerer 'string' a[sMyString] = "noget"; alert(a.length); // returnerer '124'
Der er således ikke tale om 'to helt forskellige ting'. Tværtimod har vi her fat i én af de ikke helt få uhensigtsmæssigheder (eller 'uigennemtænktheder'), vi trækkes med i JS. Object objektets mangler som ideelt hashtable er et andet. Til denne opgave er Object dog stadig langt at foretrække fremfor Array - da sidstnævnte jo er en extension af Object og indeholder langt flere properties/metoder, der skal tages hensyn til i hash-sammenhænge. At så Mozilla har valgt at 'forurene' Object objektet med en håndfuld nonstandard/proprietære properties/metoder er så en anden ting :o|
Så er det nok dér, vi taler forbi hinanden. Jeg taler om, hvad der faktisk anvendes (en streng) - og hvordan JS bruger den ... ikke hvad strengen tilfældigvis måtte 'genkendes' som.
a = []; a["123"] = "noget";
Her laver du en property på Array objektet. Dét er pointen! ;o)
At alert("3"*2); viser 6 ... har helt andre årsager
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.