Avatar billede perh Juniormester
26. september 2000 - 17:45 Der er 9 kommentarer og
1 løsning

sortering af cookie elementer

Jeg har flg funktion som skriver bestillinger i en tabel.
Hver linie starter med en dato i formatet 03-maj-00
Jeg ville gerne have sorteret tabellen så den er ordnet efter dato. ???

function showItems() {
    index = document.cookie.indexOf(\"TheBasket\");
    countbegin = (document.cookie.indexOf(\"=\", index) + 1);
    countend = document.cookie.indexOf(\";\", index);
    if (countend == -1) {
        countend = document.cookie.length;
    }
    fulllist = document.cookie.substring(countbegin, countend);
    totprice = 0;
    document.writeln(\'<TABLE BORDER cellpadding=\"2\" align=center>\');
   
    document.writeln(\'<TR><TD><b><font face=\"Arial\" size = \"2\">Dato &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;  Art</font></b></TD><TD><b><font face=\"Arial\" size = \"2\">Antal</font></b></TD><TD><b><font face=\"Arial\" size = \"2\">Pris pr. stk.</b></TD><td><b><font face=\"Arial\" size = \"2\">Total</font></b><TD align=center><b><font face=\"Arial\" size = \"2\">Fortryd</b></TD></TR>\');
    itemlist = 0;
    for (var i = 0; i <= fulllist.length; i++) {
        if (fulllist.substring(i,i+1) == \'[\') {
            itemstart = i+1;
            } else if (fulllist.substring(i,i+1) == \']\') {
            itemend = i;
            thequantity = fulllist.substring(itemstart, itemend);
            itemtotal = 0;
            itemtotal = (eval(theprice*thequantity));
            temptotal = itemtotal * 100;
            totprice = totprice + itemtotal;
            itemlist=itemlist+1;
            document.writeln(\'<tr><td><font face=\"Arial\" size = \"2\">\'+theitem+\'</font></td><td align=center><font face=\"Arial\" size = \"2\">\'+thequantity+\'</font></td><td align=right><font face=\"Arial\" size = \"2\">\'+theprice+\'</font></td><td align=right><font face=\"Arial\" size = \"2\">\'+top.shop.alterError(itemtotal)+\'</font></td><td><font size = \"1\" face=\"Arial\"><a href=\"java script:removeItem(\'+itemlist+\')\">Fjern denne linie</a></font></td></tr>\');
            } else if (fulllist.substring(i,i+1) == \',\') {
            theitem = fulllist.substring(itemstart, i);
            itemstart = i+1;
            } else if (fulllist.substring(i,i+1) == \'#\') {
            theprice = fulllist.substring(itemstart, i);
            itemstart = i+1;
        }
    }
   
    document.writeln(\'<tr><td colspan=3><b><font face=\"Arial\" size = \"2\">I alt DKK</font></b></td><td align=right><font face=\"Arial\" size = \"2\">\'+top.shop.alterError(totprice)+\'</font></td> <td><font face=\"Arial\" size = \"2\"> DKK</font> </td> </tr>\');
    document.writeln(\'</TABLE>\');
}
Avatar billede helle_fred Nybegynder
27. september 2000 - 09:02 #1
Hvordan ser din cookiestreng ud, når den modtages af funktionen?
Avatar billede perh Juniormester
27. september 2000 - 12:25 #2
Et cgi-script skriver cookien ud fra en  database:
$rec{\'Dato\'} - $rec{\'Slut\'} $typerum i $hotelnavn \',$pristype,document.itemsform.b$nimmquant.value,\'\'

Jeg skal bare have sorteret første led, datoen, den har formatet 13-maj-00

Måske kan jeg sortere på et senere tidspunkt, nemlig idet tabellen i indkøbskurven skrives, hvad den gør hver gang siden kaldes.

Måske er det lettere at forstå, hvis man ser indkøbskurven på http://www.cykelbornholm.dk
Avatar billede perh Juniormester
27. september 2000 - 22:43 #3
Mere forklaring:
Hver bestilling listes som en linie i indkøbskurven.
Hver linie starter med en dato.
Linierne skal sorteres så de står i dato-orden.
Avatar billede helle_fred Nybegynder
28. september 2000 - 10:29 #4
Kan du ændre på datoformatet?

Du kan nemlig godt splitte strengen op i et array, hvor du har et element for hver post. Array har en sorteringsfunktion - men den sorterer kun alfabetisk - den kan sortere posterne, hvis datoerne har formatet 00-05-13.
Bagefter kan posterne splejses sammen igen til en streng.
Avatar billede perh Juniormester
28. september 2000 - 11:06 #5
Jeg vil meget nødigt ændre datoformatet, da det optræder i en frygtelig masse databaser.
Men array-løsningen lyder som noget jeg kan bruge, jeg mener, at det er muligt at definere sorteringsfunktionen?
Men jeg ville være meget glad for at se et forslag ti, hvordan jeg splitter strengen op i at array der kan sorteres.
Jeg skyder lidt flere point ind i puljen.
Avatar billede helle_fred Nybegynder
28. september 2000 - 13:53 #6
Jeg ville til gengæld nødig skrive en sorteringsfunktion i JavaScript, der sorterer efter dit datoformat. Men ok, sådan splitter du strengen op: Hvis hver post strengen afsluttes med f.eks \"$rec{\'Slut\'}\":

A=tekststreng.split(/\\$rec\\{\\\'Slut\\\'\\}/)
herefter kan du sortere alfabetisk med:
A.sort()
Sorterinsfunktionen gemmer ingen kopi af den oprindeligt ordnede streng.
Til sort() kan man som argument angive en sorteringsfunktion, som sammenligner to elementer og returnerer en værdi, der angiver, hvordan de skal sorteres:
- et negativt tal, hvis element to skal stå før element et
- nul, hvis de er \"lige store\"
- et positivt tal, hvis element et skal stå før element to
Hvis du har lavet sådan en funktion, f.eks
function datosortering(a,b)....
kan du skrive
A.sort(datosortering)

For at splejse arrayet sammen til en streng igen, kan du bruge array-funktionen join():

tekststreng=A.join(\"$rec{\'Slut\'}\" )

- så indsættes \"$rec{\'Slut\'}\" igen mellem delstrengene.

Avatar billede perh Juniormester
28. september 2000 - 17:37 #7
Det ser ud som noget jeg kan bruge.
Jeg har prøvet at sætte det ind efter cookien skrives:

function buyItem(newItem, newPrice, newQuantity, newtext) {

        if (newQuantity <= 0) {

            rc = alert(\'Antal skal være mindst 1\');

            return false;

        }

        if (confirm(\'Overfør \'+newQuantity+\' stk \"\'+newItem+\'\" til bestillingslisten? \' )) {

            index = document.cookie.indexOf(\"TheBasket\");

            countbegin = (document.cookie.indexOf(\"=\", index) + 1);

                countend = document.cookie.indexOf(\";\", index);

                if (countend == -1) {

                        countend = document.cookie.length;

                }
                    document.cookie=\"TheBasket=\"+document.cookie.substring(countbegin, countend)+\"[\"+newItem+\" \"+newtext+\",\"+newPrice+\"#\"+newQuantity+\"]\";

var Kok=document.cookie;

A=Kok.split(/]/);
A.sort();
Kok=A.join(\"]\" );

        }

        return true;

    }


Men jeg får ingen sortering, da jeg skal ind og have fat i og sortere efter det står efter
\"TheBasket=\"

Kan jeg det? og hvordan?

Avatar billede helle_fred Nybegynder
28. september 2000 - 23:07 #8
Når du splitter på \"]\" (du kan lige så god skrive split(\"]\") iøvrigt) - får du teksten splittet op i substenge, der hvor der står \"]\" i strengen. Men er det overhovedet tegnet, der adskiller poster i din cookiestreng - så vidt jeg kan se har du kun en enkelt post i den efter din funktion. Er det ikke meningen, at der skal tilføjes en ny post i funktionen - altså

document.cookie=document.cookie+\"The....etc


Det er ikke så nemt at gennemskue hvad du har i din cookie - prøv at konstuere en realistisk cookie, som kan bruges i test af sorteringssætningerne.
Avatar billede perh Juniormester
29. september 2000 - 19:23 #9
Cookien skulle bygge videre på det, der allerede ligger, hver linie i indkøbskurven bygges op af elementerne i cookien, hver gang der tilføjes en ordre.
Jeg prøver at granske videre i det - tak for dine forslag.
Avatar billede perh Juniormester
28. februar 2012 - 15:46 #10
lukker
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