Avatar billede lightbrain Nybegynder
15. juni 2002 - 17:15 Der 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.
Avatar billede jakoba Nybegynder
15. juni 2002 - 17:47 #1
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 );

mvh JakobA
Avatar billede lightbrain Nybegynder
15. juni 2002 - 20:32 #2
Ok, men hvad gør man så, hvis man i stedet vil søge i gruppe[1][i].emnenr. Jeg har forsøgt, men den udskriver ikke noget tal:

    var min = gruppe[1];
    for ( i=1; i<gruppe[1].length; i++ ) {
        min = Math.min( min, gruppe[1][i].emnenr);
    }
    alert( "det allermindste tal er " +min );

____________________________________________________________________________________

var gruppe = new Array();
gruppe[1] = new Array();

function artikel(artikelnr, titel, forfatter, beskrivelse, filnavn, emnenr, niveau, aendret) {
  this.artikelnr= artikelnr;
  this.titel= titel;
  this.forfatter= forfatter;
  this.beskrivelse= beskrivelse;
  this.filnavn= filnavn;
  this.emnenr= emnenr;
  this.niveau= niveau;
  this.aendret= aendret;
}
Avatar billede jakoba Nybegynder
15. juni 2002 - 21:24 #3
det er startværdien til min der er gal, det skal være den første i det array:
    var min = gruppe[1][0].emnenr;
Avatar billede lightbrain Nybegynder
15. juni 2002 - 22:20 #4
Hvis jeg skriver:

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 );

Siger den, at "is nul or not an object".
Avatar billede jakoba Nybegynder
15. juni 2002 - 22:45 #5
.emnenr  .emnenr  .emnenr  .emnenr  .emnenr  .emnenr  OK?
    var min = gruppe[1][0].emnenr;
Avatar billede jakoba Nybegynder
15. juni 2002 - 23:05 #6
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.

mvh JakobA
Avatar billede lightbrain Nybegynder
16. juni 2002 - 11:30 #7
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?
Avatar billede jakoba Nybegynder
16. juni 2002 - 12:17 #8
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.

prøv at være meget præcis i det du siger,

mvh JakobA
Avatar billede mikoalngelo Nybegynder
16. juni 2002 - 18:26 #9
Prøv lige at kigge på dette her:

<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>
Avatar billede lightbrain Nybegynder
16. juni 2002 - 18:53 #10
>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 );

_______________________________________________________________________

  var a, l;                     
  a = gruppe[1].emnenr;
  l = a.sort();                 
  return(l);
Avatar billede jakoba Nybegynder
16. juni 2002 - 19:09 #11
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.

mvh JakobA
Avatar billede lightbrain Nybegynder
16. juni 2002 - 19:27 #12
Ok, her kommer noget relevant kode:

var gruppe = new Array();
gruppe[1] = new Array();
gruppe[2] = new Array();
gruppe[3] = new Array();

function artikel(artikelnr, titel, forfatter, beskrivelse, filnavn, emnenr, niveau, aendret) {
  this.artikelnr= artikelnr;
  this.titel= titel;
  this.forfatter= forfatter;
  this.beskrivelse= beskrivelse;
  this.filnavn= filnavn;
  this.emnenr= emnenr;
  this.niveau= niveau;
  this.aendret= aendret;
}

<%
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
%>
Avatar billede jakoba Nybegynder
16. juni 2002 - 19:52 #13
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.

mvh JakobA
Avatar billede lightbrain Nybegynder
16. juni 2002 - 20:37 #14
>...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] );
}
Avatar billede lightbrain Nybegynder
16. juni 2002 - 20:38 #15
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;
Avatar billede jakoba Nybegynder
16. juni 2002 - 20:48 #16
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 );
}
Avatar billede lightbrain Nybegynder
16. juni 2002 - 21:12 #17
function ArrangerEfterVaerdi ( ) {

    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.
Avatar billede lightbrain Nybegynder
16. juni 2002 - 21:19 #18
godt nok sorter = godt nok sorterer
Avatar billede jakoba Nybegynder
16. juni 2002 - 21:34 #19
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.

mvh JakobA
Avatar billede lightbrain Nybegynder
16. juni 2002 - 21:51 #20
Yaaaa-haaa-huuuu-hiiii-hiii det virker!

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! :-)

__________________________________________________________________-

function ArrangerEfterVaerdi ( ) {

    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
Avatar billede lightbrain Nybegynder
16. juni 2002 - 21:54 #21
>> mikoalngelo
Hvis du vil have 5 points for din kode, som jeg nu - hvor min "egen kode" virker - vil bruge, så tryk lige svar.
Avatar billede mikoalngelo Nybegynder
16. juni 2002 - 21:57 #22
Oki, at svar er på vej...
=======ZOOM======-->
Avatar billede lightbrain Nybegynder
17. juni 2002 - 18:37 #23
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester