Avatar billede jtp Nybegynder
10. december 2002 - 11:26 Der er 6 kommentarer og
1 løsning

Sortering af data - client side

Hejsa


Er der nogen, der har et script til sortering af data i en tabel?

Det scriptet skal håndtere, er at sortere tabellens kolonner ud fra overskriften (TH).

Eksempel
=======================
Jeg har en tabel, der ser således ud:

ID    Produkt      Pris
-------------------------
01    Bananer      10,00
02    Ananas      25,00
03    Citroner      5,00

Jeg vil gerne have mulighed for at kunne klikke på henholdsvis [ID], [Produkt] og [Pris], hvorefter tabellen bliver sorteret ud fra valget.

Desuden kunne det være rart, at scriptet både kunne håndterer sorteringen stigende eller faldende evt. afhængig af om man har trykket på linket før, men det er sekundært.

Er det til at forstå? Ellers så skriv :o)

På forhånd tak.

jtp
Avatar billede jtp Nybegynder
10. december 2002 - 11:27 #1
Ups, glemte at skrive, at det er et krav, at selve sorteringen foregår på klientens side side....
Avatar billede nikolajdu Nybegynder
10. december 2002 - 12:52 #2
Javascript har en array.sort() funktion du muligvis vil kunne bruge - Hvordan ser din kode ud :)
Avatar billede jtp Nybegynder
10. december 2002 - 14:21 #3
Jeg har ingen kode på nuværende tidspunkt.

Håbede at der måske var nogen, der lå inde med en "færdig" kode eller evt. et link....

Det skal iøvrigt bruges på ASP-sider.
Avatar billede Slettet bruger
10. december 2002 - 16:02 #4
Avatar billede jtp Nybegynder
11. december 2002 - 09:42 #5
Faldt selv over dette script:

---klip----------------
<script language="JavaScript" type="text/javascript">
<!--


/*----------------------------------------------------------------------------
    f_sort: Performs a client side sort of the contents of a HTML Table.

    args:  ao_table, The object reference to the table to be sorted.
            ai_sortcol, The zero based column number to be sorted.
            ab_header, Bool to indicate if the table have a header
                row to be ignored.

    vars:  lastcol, used to store the last column sorted.
            lastseq, used to store the sequence the last column was sorted by.
----------------------------------------------------------------------------*/
var lastcol, lastseq;
function f_sort( ao_table, ai_sortcol, ab_header )
{
    var ir, ic, is, ii, id;

    ir = ao_table.rows.length;
    if( ir < 1 ) return;

    ic = ao_table.rows[1].cells.length;
    // if we have a header row, ignore the first row
    if( ab_header == true ) is=1; else is=0;

    // take a copy of the data to shuffle in memory
    var row_data = new Array( ir );
    ii=0;
    for( i=is; i < ir; i++ )
    {
        var col_data = new Array( ic );
        for( j=0; j < ic; j++ )
        {
            col_data[j] = ao_table.rows[i].cells[j].innerText;
        }
        row_data[ ii++ ] = col_data;
    }

    // sort the data
    var bswap = false;
    var row1, row2;
   
    if( ai_sortcol != lastcol )
        lastseq = 'A';
    else
    {
        if( lastseq == 'A' ) lastseq = 'D'; else lastseq = 'A';
    }

    // if we have a header row we have one less row to sort
    if( ab_header == true ) id=ir-1; else id=ir;
    for( i=0; i < id; i++ )
    {
        bswap = false;
        for( j=0; j < id - 1; j++ )
        {
            // test the current value + the next and
            // swap if required.
            row1 = row_data[j];
            row2 = row_data[j+1];
            if( lastseq == "A" )
            {
                if( row1[ ai_sortcol ] > row2[ ai_sortcol ] )
                {
                    row_data[j+1] = row1;
                    row_data[j] = row2;
                    bswap=true;
                }
            }
            else
            {
                if( row1[ ai_sortcol ] < row2[ ai_sortcol ] )
                {
                    row_data[j+1] = row1;
                    row_data[j] = row2;
                    bswap=true;
                }
            }
        }
        if( bswap == false ) break;
    }

    // load the data back into the table
    ii = is;
    for( i=0; i < id; i++ )
    {
        row1 = row_data[ i ];
        for( j=0; j < ic; j++ )
        {
            ao_table.rows[ii].cells[j].innerText = row1[j];
        }
        ii++;
    }
    lastcol = ai_sortcol;
}

//-->
</script>
---klip----------------

Det er utrolig nemt, at implementerer.

Denne fulde kode, kommer således til at se sådan ud:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>Sortering af data - client side</title>

<script language="JavaScript" type="text/javascript">
<!--


/*----------------------------------------------------------------------------
    f_sort: Performs a client side sort of the contents of a HTML Table.

    args:  ao_table, The object reference to the table to be sorted.
            ai_sortcol, The zero based column number to be sorted.
            ab_header, Bool to indicate if the table have a header
                row to be ignored.

    vars:  lastcol, used to store the last column sorted.
            lastseq, used to store the sequence the last column was sorted by.
----------------------------------------------------------------------------*/
var lastcol, lastseq;
function f_sort( ao_table, ai_sortcol, ab_header )
{
    var ir, ic, is, ii, id;

    ir = ao_table.rows.length;
    if( ir < 1 ) return;

    ic = ao_table.rows[1].cells.length;
    // if we have a header row, ignore the first row
    if( ab_header == true ) is=1; else is=0;

    // take a copy of the data to shuffle in memory
    var row_data = new Array( ir );
    ii=0;
    for( i=is; i < ir; i++ )
    {
        var col_data = new Array( ic );
        for( j=0; j < ic; j++ )
        {
            col_data[j] = ao_table.rows[i].cells[j].innerText;
        }
        row_data[ ii++ ] = col_data;
    }

    // sort the data
    var bswap = false;
    var row1, row2;
   
    if( ai_sortcol != lastcol )
        lastseq = 'A';
    else
    {
        if( lastseq == 'A' ) lastseq = 'D'; else lastseq = 'A';
    }

    // if we have a header row we have one less row to sort
    if( ab_header == true ) id=ir-1; else id=ir;
    for( i=0; i < id; i++ )
    {
        bswap = false;
        for( j=0; j < id - 1; j++ )
        {
            // test the current value + the next and
            // swap if required.
            row1 = row_data[j];
            row2 = row_data[j+1];
            if( lastseq == "A" )
            {
                if( row1[ ai_sortcol ] > row2[ ai_sortcol ] )
                {
                    row_data[j+1] = row1;
                    row_data[j] = row2;
                    bswap=true;
                }
            }
            else
            {
                if( row1[ ai_sortcol ] < row2[ ai_sortcol ] )
                {
                    row_data[j+1] = row1;
                    row_data[j] = row2;
                    bswap=true;
                }
            }
        }
        if( bswap == false ) break;
    }

    // load the data back into the table
    ii = is;
    for( i=0; i < id; i++ )
    {
        row1 = row_data[ i ];
        for( j=0; j < ic; j++ )
        {
            ao_table.rows[ii].cells[j].innerText = row1[j];
        }
        ii++;
    }
    lastcol = ai_sortcol;
}

//-->
</script>

</head>
<body>
<center>

  <table NAME="A" ID="A" cellpadding="0" cellspacing="0" border="1">
      <tr>
        <th><a href="java script:f_sort(document.all.A, 0, true);">ID</a></th>
        <th><a href="java script:f_sort(document.all.A, 1, true);">Produkt</th>
    <th><a href="java script:f_sort(document.all.A, 2, true);">Pris</th>
      </tr>
      <tr>
    <td>01</td>
    <td>Bananer</td>
    <td>10,00</td>
      </tr>
      <tr>
    <td>02</td>
    <td>Ananas</td>
    <td>25,00</td>
      </tr>
      <tr>
    <td>03</td>
    <td>Citroner</td>
    <td>5,00</td>
      </tr>
  </table>

</body>
</html>
Avatar billede Slettet bruger
11. december 2002 - 16:07 #6
(så luk spm)
Avatar billede jtp Nybegynder
11. december 2002 - 16:54 #7
OK :o)
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