Array

Tabeller (array) og strenger (string) kan lagre samlinger av data. En tabell brukes ofte til å lagre lister med like data. Anta at vi lager en tabell i javascript slik:

let elevTabell = [ "Ole","Per","Kari", "Lise","Lars","Oda" ];

Da kan du se for deg at tabellen ser slik ut:

IndeksElev
0Ole
1Per
2Kari
3Lise
4Lars
5Oda

Som du ser har hvert element sitt nummer (fra 0). Dette nummeret tilsvarer adressen til verdien.

Med dette bildet i hodet er det lett å forstå hvordan man henter ut en verdi fra en tabell:

NavnPåTabell[indeks]

Dette betyr: Hent ut verdien fra NavnPåTabell på plass gitt av indeks.

console.log(elevTabell[3]);
// Skriver ut "Lise"

Oppdatering/endring av en verdi skjer på samme måte:

elevTabell[4] = "Lars Even";

Legg merke til at all tekst må ha hermetegn rundt seg. Dersom jeg skrev

elevTabell[4] = Lars;

da vil js prøve å hente verdien fra en variabel med navnet Lars. Dette vil som oftest gi en feilmelding (fordi variabelen Lars ikke er definert).

Array functions

Alle array objekter har tilgang til en rekke innebygde funksjoner. Dersom du lager en ny array,
const a = []; vil du kunne se alle de innebygde funksjonene ved å skrive a. i console på en nettleser.

I vs-code vil du få følgende bilde:

a.
|copyWithin | => (method) Array<any>.copyWithin(target: number,
|entries | start: number, end?: number): any[]
|every | /* enda mer forklarende text */
|fill |
|filter |
|find |

Her kan du da lete etter en funksjon og lese beskrivelse rett i editoren.

De mest sentrale array funksjonene

Lista viser de viktigste (de jeg bruker oftest)2 array funksjonene

NavnBeskrivelseeksempel
push(a)legger nytt element a bakerst i arrayetarr.push(2)
pop()henter og fjerner siste elementsiste = arr.pop()
sort()sorterer arrayet alfabetisk 1arr.sort
contains(a)true dersom a finnes i arrayetif(arr.contains("ole"))
find(f)finner verdi som oppfyller testarr.find(e => e >100)
join(sep)limer sammen bitene til en tekst med sep mellomarr.join(",")
slice(start,slutt)lager kopi [start..slutt-1]kopi = arr.slice()
reverse()snur rekkefølgenarr.reverse())
shift()henter ut og fjerner første elementfirst = arr.shift()
unshift(a)legger inn nytt første-elementarr.unshift(2)

Arbeide med tabeller

Vi har tabellen elevTabell som vi nå ønsker å skrive ut

IndeksElev
0Ole
1Per
2Kari
3Lise
4Lars
5Oda

For å skrive ut alle elementene i tabellen bruker vi en løkke:

const elevTabell = [ "Ole","Per","Kari","Lise","Lars","Oda" ];
let i; // løkketelleren
// løkketelleren defineres helst inne i løkka - har den på utsida her
// for å fremheve den i forklaringen
let ant = elevTabell.length; // antall elementer
for (i = 0; i < ant; i++) {
let elev = elevTabell[i];
console.log(elev);
}
// standard for løkke brukt på array
for (let i=0; i < arr.length; i++) {
const verdi = arr[i];
// gjør noe med verdi
}
// du kan også bruke denne metoden (es2016)
for (const elev of elevTabell) {
console.log(elev);
}
// i denne løkka er: elev <=> elevTabell[i]

Her ser vi at alle Tabeller (arrays) har en innebygd egenskap med navnet length som gir deg antall elementer i tabellen.

Denne er viktig å kjenne til slik at du kan finne lengden på tabellen (antall elementer).

Array funksjoner

Flere dimensjoner

Flerdimensjonale tabeller. Tenk deg at du skal lage et sudoku brett. Brettet er 9 x 9 ruter. Du ønsker å bruke en array til å lagre brettet.

let Brett = [
[ 0,0,0,0,0,0,0,0,0 ],
[ 0,0,0,0,0,0,0,0,0 ],
[ 0,0,0,0,0,0,0,0,0 ],
[ 0,0,0,0,0,0,0,0,0 ],
[ 0,0,0,0,0,0,0,0,0 ],
[ 0,0,0,0,0,0,0,0,0 ],
[ 0,0,0,0,0,0,0,0,0 ],
[ 0,0,0,0,0,0,0,0,0 ],
[ 0,0,0,0,0,0,0,0,0 ],
];

Du kan nå legge inn tallene dine slik:

Brett[0][1] = 4;
Brett[0][2] = 5;

Dette kalles en todimensjonal tabell, du må oppgi to verdier for å spesifisere en celle i tabellen (tilsvarer (x,y) i koordinatsystemet). Du kan selvsagt lage tabeller med flere nivåer (en tabell inne i en tabell inne i en tabell … …).
En mye brukt teknikk er å lage en tabell som inneholder objekter . Et objekt kan for eksempel være informasjon om en elev. Vi kan da lage en tabell med info om elever slik:

let arrElever = [
{ fornavn:"Ole", etternavn:"Olsen", klasse:"3A", poeng:20 },
{ fornavn:"Lise", etternavn:"Larsen", klasse:"3A", poeng:22 },
{ fornavn:"Lars", etternavn:"Nilsen", klasse:"3B", poeng:21 }
];

Mer om Array funksjoner

Funksjoner som endrer verdiene i arrayet

let a = [1,12,4,5,612,44,55,121212];
// sorter a alfabetisk ('1' > '12')
a.sort(); // a === [ 1,12,,121212,4,44,5,55,612]
// sorter a numerisk
a.sort( (x,y) => x - y ); // a === [1, 4, 5, 12, 44, 55, 612, 121212]
// sorter a numerisk synkende
a.sort( (x,y) => y - x ); // a === [121212, 612, 55, 44, 12, 5, 4, 1]
// reverser a
a.reverse(); // a === [121212, 55, 44, 612, 5, 4, 12, 1]

Funksjoner som gir en ny array som resultat

// største tall i a
let maksimum = Math.max(...a); // 121212
// minste tall i a
let minimum = Math.min(...a); // 1
// summen av tallene i a
let total = a.reduce( (sum,v) => sum + v, 0); // den siste nullen er startverdien for sum
// v vil få verdien til tallene i a i sekvens
// endre tallene i a med et uttrykk/funksjon
let b = a.map( e => 2 * e + 4);
// b === [6, 28, 12, 14, 1228, 92, 114, 242428]
// filtrer tallene i a
let c = a.filter( e => e % 2 === 0);
// c === [12, 4, 612, 44, 121212]
// test om alle tallene i a oppfyller en betingelse
let barePositive = a.every( e => e > 0);
// barePositive === true , fordi alle tall i a er > 0

En innebygd travasering av array-elementer

// utfør en funksjon for hver verdi i a
a.forEach(doit);
function doit(verdi, index) {
// verdi vil være tallene fra a i sekvens
// index vil være posisjonen verdi har i a (tilsvarer løkkeindeks).
}

Endring av alle verdier i en array med .map

// eksempel: vi har et array med årstall
// vi vil ha et array med antall år etter 1969
// slik: [1, 6, .... ]
let years = [ 1970, 1976, 1982, 1994, 2013 ];
let x = years.map( e => e - 1970 );

Sortere elementer med egenskaper

Du kan også sortere array som inneholder objekter.

class Elev {
constructor(fornavn,etternavn,klasse) {
this.fornavn = fornavn;
this.etternavn = etternavn;
this.klasse = klasse;
}
}
let elever = [];
elever.push(new Elev("ole","olsen","3a") );
elever.push(new Elev("kar","olsen","3a") );
elever.push(new Elev("lasse","olsen","3a") );
elever.push(new Elev("lise","olsen","3a") );
elever.sort( (x,y) => +(x.fornavn > y.fornavn)
|| +(x.fornavn === y.fornavn) - 1 );
// her sortereres det på fornavn a..z
// denne gjør det samme, men det er litt
// lettere å se hva som skjer
elever.sort( (x,y) => {
if (x.fornavn > y.fornavn) return 1;
if (x.fornavn === y.fornavn) return 0;
return -1;
} );
// merk at alle funksjoner gitt til sort skal
// returnere 1,0,-1
// henholdsvis dersom større,lik,mindre
// for sammeligningen mellom x og y

  1. Egentlig bruker jeg map,reduce,replace,filter mest.
  2. Se numerisk sortering
Last updated on