15. juni 2002 - 17:15Der er
21 kommentarer og 2 løsninger
Find mindste værdi?
Hej
Hvordan søger man i et array efter det objekt, som har den mindste værdi, hvorefter det indsættes i et anden array og man søger efter det næste objekt osv. (indtil alle objekterne er værdimæssigt arrangeret)?
Værdierne kan - i mit tilfælde - ikke være mindre end 0, men omvendt kan flere objekter godt have den samme værdi, hvorved et af dem bliver nødt til at blive indsat før det andet.
Hvis det er nemmere at flytte rundt i kun et array, er denne løsning også ok.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
var ditArray = new Array( 2,6,4,9,33,6,1,6,7 ); // eller hvad du nu har i det.
var min = ditArray[0]; // arrayet skal indeholde mindst een celle for ( i=1; i<ditArray.length; i++ ) { min = Math.min( min, ditArray[i] ); } alert( "det allermindste tal er " +min );
var min = gruppe[1][0]; for ( i=1; i<gruppe[1].length; i++ ) { min = Math.min( min, gruppe[1][i].emnenr); } alert( "det allermindste tal er " +min );
Siger den, at min er undefined.
Hvis jeg skriver: var min = gruppe[1][0].emnenr; for ( i=1; i<gruppe[1].length; i++ ) { min = Math.min( min, gruppe[1][i].emnenr); } alert( "det allermindste tal er " +min );
noget ander er at det er noget helt andet du ønsker :-))
function fnavnObj ( a, b ) { // a og b er tabelceller der skal sammenlignes if ( a.emnenr == b.emnenr ) return 0; // 0 for ens elementer if ( a.emnenr > b.emnener ) return 1; // 1 for a > b return -1; // -1 for b > a }; //end fnavnObj
var nytArray = oldArray.sort( fnavnObj ); // sorter over i nye array.
nytArrray vil så indeholde de samme elementer som oldArray, men elementerne i nytArray er sorteret fra det mindste forrest til det største bagerst.
hvordan sammenligningsfunktionen skal skrives hvommer an på hvad der er i arraycellerene og hvordan det skal sammenlignes.
Men hvorfor er det lige, at man ikke kan finde den mindste værdi vha. Math.min i en celleværdi (hvis man kalder det det), der hedder gruppe[1][0].emnenr?
Ud fra mit ringe kendskab til scripting, så er det ganske logisk at man - ligesom man kan finde det mindste objekt - også burdte kunne finde det mindste celleværdi (gruppe[1][0].emnenr).
Eller er der kun en måde at gøre det på (når det handler om celleværdier), nemlig at gøre det på slavemåden ved at sammeligne en bestemt celleværdi med andre objekters celleværdier, som løbende kopiere dem over i et nyt array?
funktionen Math.min( tal1, tal2 ) returnerer det mindste af de 2 tal der gives som parameter. Hvis man kun har eet tal giver det ligesom ingen mening at bruge funktionen. Og gruppe[1][0].emnenr er kun eet enkelt tal.
Jeg tror mest vi har et problem emd ord her, IT ord er meget specifikke; de har som regel kun een eneste meget præcis betydning.
25 == et tal == en numerisk mælgdeangivelse '25' == en streng == et antal bogstaver efter hinanden ( her '2' og '5' at de 2 bogstaver så staver til et tal er underordnet sålænge de står i en steng er de blot bogstaver. gruppe == em variabel. variablen kan så have en af mange typer (det kan være et et, en streng, et array, et objekt og flere ander din variabel gruppe er et array bestående at et antal arrayceller gruppe[1] == en variabel. denne variabel er den tabelecelle i arrayet gruppe der er indekseret med tallet 1 og som alle andre variable har den en type. den er også et array. gruppe[1][0] == en variabel. denne variabel er den tabelecelle i arrayet gruppe[1] der er indekseret med tallet 0 den variabel er et opjekt, der indeholdet en eller flere elementer (eller attributter) gruppe[1][0].emnenr == en variabel == et f elementerne i objektet gruppe[1][0] fordi du kalder den noget met 'nr' gætter jeg på at den indehoder et tal, men det er et gæt jeg ved ikke bestemt at den variabel indeholder en talværdi.
når man tænker IT skal man helt tænke på sådan en hylende overpræcis eksakt måde hele vejen igennem, og det er en ret umenneskelig måde at tænke på, så når du siger "(hvis man kalder det det)" gibber det lidt i mig. jeg HADER 'hvis' der ikke klart og tydeligt efterfølges af en beskrivelse af hvilket hvis hvornår og hvorfor du mener det i dette tilfældet forudsat klokken er imellem 12:00 og 15:00 og du ikke har spist rejemad dagen før.
<SCRIPT TYPE="text/javascript"> a = new Array(1,15,3,8); konvStreng(); CifferAntal(20); b = a.sort(); konvNummer(); document.write(a.join(', '))
function konvStreng(){ for (x = 0; x < a.length; x++){ a[x] = String(a[x]); } } function CifferAntal(Antal){ for (y = 0; y < a.length; y++){ while (a[y].length < Antal){ a[y] = "0" + a[y]; } } } function konvNummer(){ for (z = 0; z < a.length; z++){ a[z] = Number(a[z]); } } </SCRIPT>
>jakoba Ok, tak for præciseringen. Jeg skal nok prøve at være mere præcis.
>mikoalngelo Jeg vil sikkert også bruge det, men først skal jeg lige have det til at virke med "gruppe[1].emnenr", så kan jeg altid senere udvide det med din kode.
Jeg får "undefined-fejlen" ved både math.min metoden eller sort metoden:
for ( i=1; i<gruppe[1].length; i++ ) { mindstetal = Math.min( gruppe[1][0].emnenr, gruppe[1][i].emnenr); } alert( "det allermindste tal er " +mindstetal );
når du siger gruppe[1].emnenr; forudsætter du at gruppe[1] er et objekt der indeholder elementet emnenr. men når du siger: gruppe[1][0].emnenr forudsætter du at gruppe[1] er et array. begge dele kan ikke være korrekt på een gang
Kunne det være at gruppe[1] slet ikke er et array?
prøv at vise noget mere af koden, specielt der hvor du opretter variabelen gruppe og fylder noget i den.
<% response.write "<script>" strSQL = "select * from ARTIKLER" set rs = Conn.execute(strSql) i = 1 while not (rs.EOF OR rs.BOF) response.write "gruppe[1][" & i & "]=new artikel (""" & rs("artikelnr") & """,""" & rs("titel") & """,""" & rs("forfatter") & """, """ & rs("beskrivelse") & """, """ & rs("filnavn") & """, """ & rs("emnenr") & """, """ & rs("niveau") & """);" i = i + 1 rs.MoveNext wend
if Request.form("valg") = "IndsaetArtikel" then
strSQL = "select * from ARTIKLER WHERE ARTIKELNR = " & Request.form("artikelnr") set rs = Conn.execute(strSQL) if rs.EOF then Session.LCID = 1030 strSQL = "INSERT INTO ARTIKLER (titel, forfatter, beskrivelse, filnavn, emnenr, niveau, dato) VALUES ('" & Request.form("titel") & "','" & Request.form("forfatter") & "','" & Request.form("beskrivelse") & "','" & Request.form("filnavn") & "','" & Request.form("emne") & "','" & Now() & "')" set rs = Conn.execute(strSQL) status = "Artiklen er nu blevet oprettet!" else status = "Artiklen er IKKE blevet oprettet, da en artikel med samme titel allerede eksisterer!" end if end if %>
jeg kommer nok til at bakke ud heromkring, er ikke ret god til .ASP
kan det passe at du aldrig bruger gruppe[2] eller gruppe[3] til noget?
ihvertfald er det helt klart at linien a = gruppe[1].emnenr; er ukorrekt. der skal 2 indekser på før det giver mening at skrive .emnenr tilsidst.
nedenstående 8 linier:
function fnavnObj ( a, b ) { // a og b er tabelceller der skal sammenlignes if ( a.emnenr == b.emnenr ) return 0; // 0 for ens elementer if ( a.emnenr > b.emnener ) return 1; // 1 for a > b return -1; // -1 for b > a }; //end fnavnObj
var nytArray = oldArray.sort( fnavnObj ); // sorter over i nye array.
vil sørge for at arrayet gruppe[2] indeholder de samme data som arrayet gruppe[1], blot vil cellerne i gruppe[2] været sorteret efter emnenr.
>...kan det passe at du aldrig bruger gruppe[2] eller gruppe[3] til noget? Nej, jeg bruger dem godt nok, men jeg har ikke taget koden med, som tilgår disse.
Mht. følgende er forbliver nytArray tom, hvorved intet udskrives - hvorfor?
function fnavnObj ( a, b ) { // a og b er tabelceller der skal sammenlignes if ( a.emnenr == b.emnenr ) return 0; // 0 for ens elementer if ( a.emnenr > b.emnener ) return 1; // 1 for a > b return -1; // -1 for b > a }; //end fnavnObj
var nytArray = gruppe[1].sort( fnavnObj ); // sorter over i nye array. for ( i=1; i<nytArray.length; i++ ) { alert( nytArray[i] ); }
Mht. følgende er forbliver nytArray tom = Mht. følgende forbliver nytArray tom if ( a.emnenr > b.emnener ) return 1; = if ( a.emnenr > b.emnenr ) return 1;
test om der overhovedet står noget i arrayet gruppe[1] på det tidspunkt hvor du sorterer:
for ( i=1; i<gruppe[1].length; i++ ) { // se om der er noget at sortere alert( gruppe[1][i].emnenr ); } var nytArray = gruppe[1].sort( fnavnObj ); // sorter over i nye array. for ( i=1; i<nytArray.length; i++ ) { // se hvad der blev sorteret til alert( nytArray[i].emnenr ); }
for ( i=1; i<gruppe[1].length; i++ ) { // se om der er noget at sortere alert("Her kommer det IKKE sortede array: " + gruppe[1][i].emnenr ); }
var nytArray = gruppe[1].sort( fnavnObj ); // sorter over i nye array. for ( i=1; i<nytArray.length; i++ ) { // se hvad der blev sorteret til alert("Her kommer det sortede array: " + nytArray[i].emnenr ); } }
function fnavnObj ( a, b ) { // a og b er tabelceller der skal sammenlignes if ( a.emnenr == b.emnenr) return 0; // 0 for ens elementer if ( a.emnenr > b.emnenr ) return 1; // 1 for a > b return -1; // -1 for b > a }; //end fnavnObj
____________________________________
Ovenstående udskriver: Her kommer det IKKE sortede array: 5,3,0,3 Her kommer det sortede array: 0,3,3,5
Selvom den udskriver tallene korrekt, kommer den alligevel med fejlen "emnenr is null or not an object" ved linien "alert( nytArray[i].emnenr );". Men det passer jo fint sammen med det, som du allerede har forklaret, nemlig at..."er ukorrekt. der skal 2 indekser på før det giver mening at skrive .emnenr tilsidst."
Så tæt på mål, hvad skal der så ændres i "nytArray[i].emnenr", selvom den godt nok sorter tallene korrekt.
Der var den. javascript arrays starte altid med indeks 0 som mindste indeks, men idet du fylder data i starter du med at fylde i indeks 1
i = 1 while not (rs.EOF OR rs.BOF) response.write "gruppe[1][" & i & "]=
er det ikke noget med at BV starter arrays med 1? Allenfals forventer sort funktionen at der er et elemnet 0 dvs gruppe[1][0].emnenr men den opretter du ikke.
Hov. STOP. når du starter med navnet gruppe skal der 2 indekser på fordi gruppe er to arrayled fra emnenr. men nytArray er bare et array i een dimension. det skal ikke have 2 indekser. det er fint som du har det.
i funktionen ArrangerEfterVaerdi ( ) bør de 2 forløkker dog starte ved 0 og ikke 1.
Det var dog ikke de to forløkkes tællere, der skulle ændres til 0 (det gav i begge tilfælde fejl), men der skulle i stedet stå "nytArray[i-1].emnenr", altså "nytArray[i-1]" i stedet for "nytArray[i]".
Så blev den problemstilling også ordnet inden Sovstrups. Mange tak for hjælpen! :-)
for ( i=1; i<gruppe[1].length; i++ ) { // se om der er noget at sortere alert("Her kommer det IKKE sortede array: " + gruppe[1][i].emnenr ); }
var nytArray = gruppe[1].sort( fnavnObj ); // sorter over i nye array. for ( i=1; i<nytArray.length; i++ ) { // se hvad der blev sorteret til alert("Her kommer det sortede array: " + nytArray[i-1].emnenr ); } }
function fnavnObj ( a, b ) { // a og b er tabelceller der skal sammenlignes if ( a.emnenr == b.emnenr) return 0; // 0 for ens elementer if ( a.emnenr > b.emnenr ) return 1; // 1 for a > b return -1; // -1 for b > a }; //end fnavnObj
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.