Avatar billede nielsen2002 Nybegynder
29. januar 2008 - 10:41 Der er 11 kommentarer og
1 løsning

Sortering af associative array

Hej Kloge hoveder.

Jeg har et array som indeholder nogle størrelser til nogle produkter.

sizes["PROD435"] = "34";
sizenames[sizenames.length] = "PROD435";
sizes["PROD434"] = "32";
sizenames[sizenames.length] = "PROD434";   
sizes["PROD441"] = "36";
sizenames[sizenames.length] = "PROD441";

Jeg looper så i gennem mit array således.

for (i=0; i<sizenames.length;i++) {
sizes[sizenames[i]];
}

dette loop resultere i: 34 32 36

Jeg har nu fået brug for at sortere på dette array.

så mit loop returnere dette i stedet 32 34 36.

hvordan kan jeg gøre dette?

/mvh
  Martin
Avatar billede montago Praktikant
29. januar 2008 - 11:03 #1
sizes["PROD435"] = "34";
sizenames[sizenames.length] = "PROD435";
sizes["PROD434"] = "32";
sizenames[sizenames.length] = "PROD434"; 
sizes["PROD441"] = "36";
sizenames[sizenames.length] = "PROD441";

Jeg looper så i gennem mit array således.

//---------
sizenames.sort()
//---------

for (i=0; i<sizenames.length;i++) {
sizes[sizenames[i]];
}
Avatar billede montago Praktikant
29. januar 2008 - 11:05 #2
heh... det var svare :)
Avatar billede roenving Novice
29. januar 2008 - 16:13 #3
Vil det altid være sådan, at jo højere prod-nummer, jo højere værdi, som i eksemplet ?-)
Avatar billede montago Praktikant
29. januar 2008 - 17:56 #4
der må jo være en mening med galskaben...

at array'et er dobbelt associeret med tekst værdier... ?
at 34,32,36 er strenge... ?
Avatar billede nielsen2002 Nybegynder
30. januar 2008 - 10:08 #5
Produkt nummer og størrelse hænger ikke samme. Så der vil sagtens kunne opstå situationer som f.eks. nedenstående:

sizes["PROD440"] = "34";
sizenames[sizenames.length] = "PROD440";
sizes["PROD450"] = "32";
sizenames[sizenames.length] = "PROD450"; 
sizes["PROD460"] = "36";
sizenames[sizenames.length] = "PROD460";
sizes["PROD470"] = "30";
sizenames[sizenames.length] = "PROD470";

Mit arrays bliver genereret ud fra noget database udtræk, så alt er muligt :P
Avatar billede montago Praktikant
30. januar 2008 - 11:14 #6
kunne du bruge mit svar ?
Avatar billede nielsen2002 Nybegynder
30. januar 2008 - 15:23 #7
montago >> Desværre, jeg tror ikke en simpel sort på sizenames er det jeg har brug for, da jeg egentlig skal bruge sizenames sorteret efter den tilhørende value i Sizes arrayet.

Egentlig skal mit sizes[] ikke sorteres. men mit sizenames[] array skal sorteres så jeg får produkt numrene ud i denne rækkefølge PROD470 PROD450 PROD440 PROD460 når jeg looper igennem dem således:

for (i=0; i<sizenames.length;i++) {
alert( sizenames[i] );
}
Avatar billede olebole Juniormester
30. januar 2008 - 21:38 #8
<ole>

Prøv at forklare, hvad det skal bruges til og hvordan, for det lader til at være noget rod, du har bevæget dig ud i  :)

/mvh
</bole>
Avatar billede nielsen2002 Nybegynder
31. januar 2008 - 08:25 #9
Jeg skal forsøge at forklare.

Jeg har et CMS hvor der er oprettet nogle produkter som findes i forskellige størrelser, hver ny størrelse får sit eget ProduktNr.

Det jeg så skal hive ud i min frontend er et array som indeholde mine 'Sizes' koblet sammen med mit produktNr.

Jeg skal senere loope på mit array fordi jeg skal generere en html tabel som indeholder alle mine størrelser, og her skal de komme i rigtig række følge.

Jeg har lavet funktionen som generere min tabel, og det virker perfekt, bortset fra at 'sizes' kommer i vilkårlig rækkefølge. Jeg har ikke mulighed for i CMSen at sortere dem der.

Så... jeg laver et array som denne

sizes["PROD440"] = "34";
sizenames[sizenames.length] = "PROD440";
sizes["PROD450"] = "32";
sizenames[sizenames.length] = "PROD450"; 
sizes["PROD460"] = "36";
sizenames[sizenames.length] = "PROD460";
sizes["PROD470"] = "30";
sizenames[sizenames.length] = "PROD470";

hvor jeg skal have sorteret 'sizenames' på baggrund af den value som "hører til" i 'sizes'.

Håber dette har kastet lidt lys på min problemstilling.
Avatar billede nielsen2002 Nybegynder
31. januar 2008 - 11:25 #10
Nu har jeg selv fundet løsningen på problemet, det endte ud med at dette script kunne løse mit problem.

function sort() {
    var mySizenames = arguments[0];
    var mySizes = arguments[1];
    var myNewSizenames = new Array(); //
    var tempA1 = new Array(); //
    var tempA2 = new Array();    //
   
    // loop gennem mit mySizenames array
    for (i =0; i<mySizenames.length; i++) {
      // hent dens størrelse
    innerVal = parseInt(mySizes[mySizenames[i]])   
    insertAtPos = 0;   
   
    if (i == 0) { // Tilføj første produkt
        myNewSizenames[0] = mySizenames[0];
    } 

        // hvis vi har tilføjet 1 produkt, skal vi checke om det
        // næste product skal ind før eller efter.             
        if (i > 0) {
            // Loop igennem vare i det sorterede array.
            // Find den ud af om vores nye værdi skal ind først sidst eller i midten.           
            for (j = 0; j < myNewSizenames.length; j++) {
                // tæl insertAtPos en op.
                if (innerVal > mySizes[myNewSizenames[j]]) {                   
                    insertAtPos++               
                }
            }
                   
            // første gang vi tilføjer en ekstra skal den enten før eller efter
            if (myNewSizenames.length == 1) { // efter
                if (insertAtPos > 0) {                       
                    myNewSizenames[myNewSizenames.length] = mySizenames[i];   
                } else { // før   
                    myNewSizenames.unshift(mySizenames[i]);
                }               
            // når myNewSizenames indeholder flere skal vi finde ud af hvor i arrayet den nye skal indsættes
            } else {
                if (insertAtPos > 0) {
                  // hvis insertAtPos == myNewSizenames.length skal den nye værdi indsættes i slutningen
                    if (insertAtPos == myNewSizenames.length) {
                        myNewSizenames[myNewSizenames.length] = mySizenames[i];
                    // ellers skal den indsættes et sted i arrayet.
                    } else {
                        // split myNewSizenames i 2. og indsæt den nye værdi i slutningen af den første
                        tempA1 = myNewSizenames.slice(0,insertAtPos);
                        tempA1[tempA1.length] = mySizenames[i];
                        tempA2 = myNewSizenames.slice(insertAtPos);
                        myNewSizenames = tempA1.concat(tempA2);
                    }
                } else {
                    myNewSizenames.unshift(mySizenames[i]);
                }                       
            }
        }
    }
    return myNewSizenames;
}

var sizes = [];
var sizenames = new Array();

sizes["PROD490"] = "38";
sizenames[sizenames.length] = "PROD490";
sizes["PROD480"] = "28";
sizenames[sizenames.length] = "PROD480";
sizes["PROD460"] = "36";
sizenames[sizenames.length] = "PROD460";
sizes["PROD470"] = "30";
sizenames[sizenames.length] = "PROD470";
sizes["PROD440"] = "34";
sizenames[sizenames.length] = "PROD440";
sizes["PROD450"] = "32";
sizenames[sizenames.length] = "PROD450"; 

sort(sizenames,sizes);

/mvh
  Martin
Avatar billede nielsen2002 Nybegynder
02. august 2008 - 14:04 #11
lukker
Avatar billede olebole Juniormester
02. august 2008 - 14:25 #12
<ole>

Du bør nok anvende objekter i stedet for arrays. Associative arrays, som de kendes fra andre sprog, findes ikke i JavaScript - og arrays er ikke et hensigtsmæssigt 'hack' at bruge  ;o)

/mvh
</bole>
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