JavaScript
Børre Stenseth
Noen begreper >Array

Array

Array er en klasse i JavaScript. Arrayer i JavaScript er fleksible og nyttige. Vi kan blande hva vi vil ha i de forskjellige elementene i arrayen, vi kan sortere og splitte og legge til og fjerne elementer og trikse med mye rart. Det er mange temaer knyttet til arrays eller lister. Her finner du det meste grunnleggende. Det er mer fruktbart å betrakte det som en liste framfor en strikt struktur slik som arrays er implementert f.eks Java. Denne fleksibilitetet har selvsagt med det å gjøre at JavaScript er et interpretert språk. I de fleste eksemplene nedenfor bruker jeg for enkelhets skyld stringer som array-elementer, men jeg kan som sagt blande objekter etter ønske. Det er viktig hele tiden å huske at en liste inneholder referanser, pekere, til objekter.

Vi kan opprette en liste på mange måter. Her lager vi samme liste flere ganger. (Ikke spesielt lurt men for demonstrasjonens skyld)

function setupArray1(){
    
    var list=new Array('Ole','Hans','Peder')
  
    list=new Array();
    list=['Ole','Hans','Peder'];
  
    list=new Array();
    list[0]='Ole';
    list[1]='Hans';
    list[2]='Peder';
  
    list=[]
    list.push('Ole');
    list.push('Hans');
    list.push('Peder');
  
    list=['Ole','Hans','Peder'];
  
    var S='Ole,Hans,Peder'
    list=S.split(',');
      
    return list;
}

Merk:

function setupArray2(){
    A=new Array();
    A[0]='Ole';
    A[2]='Peder';
    document.getElementById("dump1").innerHTML="dump1: "+
        A[0]+","+A[1]+","+A[2];
    document.getElementById("dump2").innerHTML="dump2: "+
        A.join(",");
}

Test:

Arrayen har altså fått tilstrekkelig mange elementer, men ett av dem er ikke definert.

Array har egenskapen length, og blandt andre metodene: join, reverse, shift, pop, push og sort

push og pop

push() legger til et nytt element i enden på en array, mens pop fjerner og returnerer det siste elementet i en array. Det vil si at arrayen kan fungere som en stack. Anta følgende oppsett:

function pp(){
    var list1=[];
    list1.push('jens');
    list1.push('ole');
    var S=list1.pop()+','+list1.pop()+', og da er lengden: '+list1.length;
    alert(S);
}

Test:

concat og join

Med concat kan vi slå sammen arrays og med join kan vi lage en string av arrayen:

function conc(){
    var list1=[];
    list1.push('jens');
    list1.push('ole');
    var list2=new Array('kari','marit');
    var list3=['pedersen','hansen']
    var list=list1.concat(list2,list3);
    var T=list.join(',');
    alert(T);
}

Test:

Hvis vi fortsetter med

list=list.reverse();
var T=list.join(',');

får vi T:hansen,pedersen,marit,kari,ole,jens

sort

Metoden sort krever en kommentar. Hvis vi skriver følgende:

Liste=new Array(1,3,5,2,4,11,33);
Liste.sort();

Ender vi med følgende rekkefølge:
1,11,2,3,33,4,5
altså som om heltallene skulle vært stringer. Dersom vi ønsker å sortere numerisk kan vi gjøre slik:

function sequenceNumber(a,b){
  return a - b
}
Liste=new Array(1,3,5,2,4,11,33);
Liste.sort(sequenceNumber);

Dette gir oss:
1,2,3,4,5,11,33

Det betyr generelt at vi kan putte mye rart inn i en array og bestemme sorteringsrekkfølgen i en egen sammenligningsfunksjon.

Dersom vi ønsker å randomisere en array, kan vi gjøre dette på flere måter. F.eks. slik:

function shuffle(list) {
  var i, j, t;
  for (i = 1; i < list.length; i++) {
	j = Math.floor(Math.random()*(1+i));  // j in [0..i]
	if (j != i) {
	  //swap
	  t = list[i];          
	  list[i] = list[j];
	  list[j] = t;
	}
  }
}

Finn et element

Vi kan lete etter et element i en array med indexOf, lastIndexOf og find og vi kan bruke en del andre funksjoner for å finne fram i lister. Vi går ikke inn i detaljene her, men det kan være verdt å merke seg et par ting.

Det første eksempelet under fungerer. Riktig nok er en tekster, eller en stringer, objekter men de har bare en verdi og JavaScript greier å gjøre sammenligningen i søket på innhold og ikke på referanse.

function find1(){
    var list1=[];
    list1.push('jens');
    list1.push('hans');
    alert(list1.indexOf('hans'));
}

Test:

Hvis vi har mer sammensatte, kanskje, egendefinerte objekter blir det litt mer komplisert:

function find2(){
    var list1=[];
    var j={p1:"jens",p2:'kari'};
    var h={p1:"hans",p2:'marit'};
    list1.push(j);
    list1.push(h);
    // dette går ikke bra:
    alert(list1.indexOf({p1:"hans",p2:'marit'}));
    // men når vi bruker referansen går det greitt
    alert(list1.indexOf(h));
}

Test:

splice

Vi kan putte inn nye elementer og fjerne elementer inne i en array med hjelp av splice. Vi angir hvilken index vi vil fokusere på, så sier vi hvor nage vil vil fjerne og så lister vi de vi vil sette inn. Dersom første parameter er negativ, teller vi bakfra.

function change(){
    var list=['ole','jens','per','fredrik'];
    list.splice(1,0,'jakob','trond');
    var S=list.join(',');
    list.splice(3,2);
    S+='<br/>'+list.join(',');
    list.splice(-1,0,'karoline');
    S+='<br/>'+list.join(',');
    list.splice(list.length,0,'josefine');
    S+='<br/>'+list.join(',');
    document.getElementById("dump4").innerHTML=S;
}
2
function copy(){
    var list1=['ole','jens','per','fredrik'];
    var list2=list1.slice();
    list2.sort();
    var S=list1.join(',')+'<br/>'+list2.join(',');;
    document.getElementById("dump5").innerHTML=S;
}

Test:

slice

Vi kan bruke slice til å lage en kopi av en liste. Husk da at vi kopierer ikke de objektene referansene i list peker på, bare referansene. Her er det to aktuell parametere: startindeks og endindeks. Hvis vi ikke setter noen parametere tar vi helle lista.

function copy(){
    var list1=['ole','jens','per','fredrik'];
    var list2=list1.slice();
    list2.sort();
    var S=list1.join(',')+'<br/>'+list2.join(',');;
    document.getElementById("dump5").innerHTML=S;
}

Test:

demo

Du kan jo kjøre, inspisere, kopiere og endre koden i denne demoen hvis du vil se nærmere på noen array-funksjoner
lotto.html https://borres.hiof.no/wep/js/jsarray/lotto.html

Noen begreper >Array