Seznami so posebne spremenljivke, ki lahko hranijo več vrednosti. Predstavljeni so z oglatimi oklepaji [] in vrednosti so ločene z vejico ,. Vrednosti v seznamih so lahko različnih tipov, vendar je priporočljivo, da so vse vrednosti enakega tipa.
let seznamBarv = ["rdeča", "zelena", "modra"];
let seznamStevilDoPet = [1, 2, 3, 4, 5];
let prazenSeznam = [];
let mesanSeznam = ["rdeča", 1, true, []];
Pri definiciji seznama ni potrebno vse vrednosti navesti v eni vrstici. Če je seznam dolg, ga je bolje razdeliti na več vrstic. seznamBarv bi lahko napisali tudi na naslednji način:
let seznamBarv = [
"rdeča",
"zelena",
"modra"
];
V tuji literaturi se seznam imenuje tudi array. Vrednosti v seznamu se imenujejo elementi.
Dostopanje do elementov
Elemente v seznamu lahko dostopamo z uporabo oklepajev [] in indeksa elementa. Indeks elementa je številka, ki predstavlja mesto elementa v seznamu. Indeks elementa se začne z 0, kar pomeni, da je prvi element v seznamu na mestu 0, drugi element pa na mestu 1, tretji element pa na mestu 2 itd. Še enkrat: Programerji začnemo šteti z 0, ne z 1.
let drzave = ["Slovenija", "Avstrija", "Madžarska", "Italija", "Francija"];
console.log(drzave[0]); // Izpiše "Slovenija"
console.log(drzave[1]); // Izpiše "Avstrija"
console.log(drzave[2]); // Izpiše "Madžarska"
console.log(drzave[3]); // Izpiše "Italija"
console.log(drzave[4]); // Izpiše "Francija"
Če poskušamo dostopati do elementa, ki ni v seznamu, dobimo undefined:
console.log(drzave[5]); // Izpiše undefined
Spreminjanje elementov
Elemente v seznamu lahko spremenimo tako, da jih prepišemo z novimi vrednostmi.
let solata = ["zelje", "korenje", "paradižnik", "kumara"];
console.log(solata); // Izpiše ["zelje", "korenje", "paradižnik", "kumara"]
solata[0] = "zelena solata";
console.log(solata); // Izpiše ["zelena solata", "korenje", "paradižnik", "kumara"]
solata[1] = "korenček";
console.log(solata); // Izpiše ["zelena solata", "korenček", "paradižnik", "kumara"]
Dolžina seznama
Seznam je v resnici objekt, tako kot console. Objekt ima lastnosti, ki jih lahko dostopamo z uporabo pike .. Ena od lastnosti seznama je length, ki nam pove, koliko elementov ima seznam.
let solata = ["zelje", "korenje", "paradižnik", "kumara"];
console.log(solata.length); // Izpiše 4
S uporabo dolžine seznama lahko dostopamo do zadnjega elementa seznama:
console.log(solata[solata.length - 1]); // Izpiše "kumara"
Če želimo pa izpisati vse elemente seznama, lahko uporabimo zanko for:
for (let i = 0; i < solata.length; i++) {
console.log(`Element s indeksom ${i} je ${solata[i]}`);
}
Dodajanje elementov
Sezname lahko poljubno podalšujemo, tako da dodajamo nove element na začatek ali konec seznama. To dosežemo s uporabo metod push in unshift. Metoda push doda element na konec seznama, metoda unshift pa na začetek seznama.
let sadnaKupa = ["jabolko", "hruška", "kivži"];
console.log(sadnaKupa.length); // Izpiše 3
sadnaKupa.push("banana");
console.log(sadnaKupa); // Izpiše ["jabolko", "hruška", "kivi", "banana"]
console.log(sadnaKupa.length); // Izpiše 4
sadnaKupa.unshift("ananas");
console.log(sadnaKupa); // Izpiše ["ananas", "jabolko", "hruška", "kivi", "banana"]
console.log(sadnaKupa.length); // Izpiše 5
Odstranjevanje elementov
Elemente lahko odstranimo iz seznama s pomočjo metod pop in shift. Metoda pop odstrani zadnji element seznama, metoda shift pa prvi element seznama.
let meseci = ["januar", "februar", "marec", "april", "maj", "junij"];
console.log(meseci); // Izpiše ["januar", "februar", "marec", "april", "maj", "junij"]
meseci.pop();
console.log(meseci); // Izpiše ["januar", "februar", "marec", "april", "maj"]
meseci.shift();
console.log(meseci); // Izpiše ["februar", "marec", "april", "maj"]
Preostale metode za delo s seznami
Seznami imajo še veliko drugih metod, ki jih lahko uporabimo za delo z njimi. V tabeli so navedene metode, ki vam bodo velikokrat prišle prav. Obstaja jih še več in jih lahko najdete na MDN. Naj vas ne skrbi, da je seznam metod tako dolg, saj jih boste v večini primerov uporabljali le nekaj.
| Metoda | Opis |
|---|---|
| concat() | združi en ali več seznamov in vrne rezultat |
| indexOf() | poišče element v seznamu in vrne pozicijo |
| find() | vrne vrednost prvega elementa v seznamu, ki zadovolji pogoju |
| findIndex() | vrne indeks prvega elementa v seznamu, ki zadovolji pogoju |
| forEach() | pokliče funkcijo za vsak element v seznamu |
| includes() | preveri ali seznam vsebuje vrednost |
| sort() | sortira elemente v seznamu po abecednem vrstnem redu |
| slice() | vrne pod seznam seznama v določenem intervalu |
| splice() | odstrani elemente in doda nove |
Posebnosti pri delu z seznami
Seznami so na videz tipična spremenljivka, vendar pa imajo nekaj posebnosti, ki jih je potrebno upoštevati.
let seznamEna = ["jabolko", "hruška", "kivi"];
let seznamDva = seznamEna;
seznamDva.push("banana");
console.log(seznamEna); // Izpiše ["jabolko", "hruška", "kivi", "banana"]
V zgornjem primeru smo seznam seznamEna dodelili spremenljivki seznamDva. Vendar pa seznam seznamEna nismo kopirali, temveč smo mu samo dodelili novo ime. To pomeni, da imata seznam seznamEna in seznam seznamDva isti naslov v pomnilniku. Če spremenimo seznam seznamDva, se bo spremenil tudi seznam seznamEna.
Če poenostavimo sezname v JavaScript-u, lahko rečemo, da gre za zaporedje elementov, ki se nahajajo na določenem naslovu v pomnilniku. Seznam v resnici kaže le na naslov v pomnilniku, kjer se nahajajo elementi. Če seznamu dodelimo novo ime, se ne kopira seznam, temveč se samo dodeli novo ime seznamu, ki že obstaja.
Na to lastnost moramo biti pozorni, saj lahko s tem povzročimo napake. Če želimo kopirati seznam, moramo uporabiti metodo slice ali metodo concat.
let seznamEna = ["jabolko", "hruška", "kivi"];
let seznamDva = seznamEna.slice();
seznamDva.push("banana");
console.log(seznamEna); // Izpiše ["jabolko", "hruška", "kivi"]
console.log(seznamDva); // Izpiše ["jabolko", "hruška", "kivi", "banana"]
Paziti dodatno moramo na to, da ta lastnost velja tudi ob podajanju seznamov kot argumentov funkcij.
function dodajBanano(seznam) {
seznam.push("banana");
}
let seznamEna = ["jabolko", "hruška", "kivi"];
dodajBanano(seznamEna);
console.log(seznamEna); // Izpiše ["jabolko", "hruška", "kivi", "banana"]
V tem primeru smo seznam seznamEna podali kot argument funkciji dodajBanano. Ker seznam le kaže na prostor v pomnilniku, se bo seznam seznamEna spremenil tudi v funkciji dodajBanano.
Spremenljivke tipov število, niz in logična vrednost se zmeraj kopirajo, ko jih podamo kot argument funkciji. Temu rečemo pass by value. Seznami pa se zmeraj podajo kot argument funkciji kot pass by reference.
Večdimenzionalni seznami
Seznami lahko vsebujejo tudi druge sezname. To so seznami, ki imajo več kot eno dimenzijo. V tem primeru se imenujejo večdimenzionalni seznami.
let seznamEna = ["jabolko", "hruška", "kivi"];
let seznamDva = ["banana", "ananas", "mango"];
let seznamTri = ["pomaranča", "limona", "sliva"];
let seznamCetrti = [seznamEna, seznamDva, seznamTri];
console.log(seznamCetrti); // Izpiše [["jabolko", "hruška", "kivi"], ["banana", "ananas", "mango"], ["pomaranča", "limona", "sliva"]]
let jabolko = seznamCetrti[0][0];
let pomaranca = seznamCetrti[2][0];
let ananas = seznamCetrti[1][1];
console.log(jabolko, pomaranca, ananas); // Izpiše "jabolko pomaranča ananas"
Naloge
Poskusite čim večkrat shraniti svoje delo s sistemom
gitin nato nareditipushna GitHub. Npr. po vsaki nalogi (3 zlata vredni ukazi sogit add .,git commit -m "Naredil 1. in 2. nalogo",git push).
- Napiši funckijo
vsotaSeznama(seznam), ki vrne vsoto vseh števil v seznamu. Npr.vsotaSeznama([1, 2, 3])vrne6. - Napiši funckijo
prestejZvezdice(seznam), ki vrne število vseh zvezdic v seznamu. Npr.prestejZvezdice(["*", "*", "*", "x", "*", "*"])vrne4. - Napiši funckijo
poisciMax(seznam), ki vrne največjo vrednost v seznamu. Npr.poisciMax([1, 2, 3])vrne3. - Napiši fukcijo
povprecjeSeznama(seznam), ki vrne povprečje vseh števil v seznamu. Npr.povprecjeSeznama([1, 2, 3])vrne2. - Napiši funkcijo
sestaviSeznam(seznam1, seznam2), ki vrne seznam, ki je sestavljen iz elementov seznamaseznam1inseznam2. Npr.sestaviSeznam([1, 2, 3], [4, 5, 6])vrne[1, 2, 3, 4, 5, 6]. Ne uporabljajte metodeconcat. - Napiši funkcijo
aliStaSeznamaEnaka(seznam1, seznam2), ki vrnetrue, če sta seznam1 in seznam2 enaka. Npr.aliStaSeznamaEnaka([1, 2, 3], [1, 2, 3])vrnetrue. Če sta seznam1 in seznam2 različna, vrnefalse. Npr.aliStaSeznamaEnaka([1, 2, 3], [1, 2, 4])vrnefalsealialiStaSeznamaEnaka([1, 2, 3], [1, 2, "3"])vrnefalse. - Napiši funckijo
aliJeSeznamUrejen(seznam), ki vrnetrue, če je seznam urejen naraščajoče. Npr.aliJeSeznamUrejen([1, 2, 3])vrnetrue. Če seznam ni urejen naraščajoče, vrnefalse. Npr.aliJeSeznamUrejen([1, 3, 2])vrnefalse. - Napiši funkcijo
aliImaSeznamDvojnike(seznam), ki vrnetrue, če ima seznam dvojnike. Npr.aliImaSeznamDvojnike([1, 2, 3, 3])vrnetrue. Če seznam nima dvojnikov, vrnefalse. Npr.aliImaSeznamDvojnike([1, 2, 3])vrnefalse.
Sklop 2
- Napiši funkcijo
obrniSeznam(seznam), ki vrne obrnjen seznam. Npr.obrniSeznam([1, 2, 3])vrne[3, 2, 1]. - Napiši funkcijo
unikatniSeznam(seznam), ki vrne seznam, ki vsebuje samo unikatne elemente. Npr.unikatniSeznam([1, 2, 3, 3])vrne[1, 2, 3]. Pokusi ohraniti vrstni red elementov. - Napiši funkcijo
razlikaSeznama(seznam1, seznam2), ki vrne seznam, ki vsebuje elemente, ki se nahajajo le v enem od seznamov. Npr.razlikaSeznama([1, 2, 3], [2, 3, 4])vrne[1, 4]. - Napiši funkcijo
rotirajVLevo(seznam), ki vrne seznam, ki je enak seznamu, le da so vsi elementi premaknjeni za eno mesto v levo. Npr.rotirajVLevo([1, 2, 3, 4, 5])vrne[2, 3, 4, 5, 1].- Dodatno, spremeni funkcijo tako, da funkcija
rotirajVLevo(seznam, n)vrne seznam, ki je enak seznamu, le da so vsi elementi premaknjeni zanmest v levo. Npr.rotirajVLevo([1, 2, 3, 4, 5], 2)vrne[3, 4, 5, 1, 2].
- Dodatno, spremeni funkcijo tako, da funkcija
- Napiši funkcijo
sahovnica(h, w), ki vrne seznam, ki predstavlja sahovnico. Vrstice sahovnice so predstavljene znotraj seznama. Npr.sahovnica(3, 3)vrne[['*', 'x', '*'], ['x', '*', 'x'], ['*', 'x', '*']]. Vrstni red črnihxin belih*se lahko začne poljubno, potrebno pa je ustvariti pravilen vzorec. Primer:
[
['*', 'x', '*'],
['x', '*', 'x'],
['*', 'x', '*']
]
Naprednejše naloge
Te naloge so zahtevnejše.
Izprazni seznam
Napiši funkcijo izprazniSeznam(seznam), ki izprazni seznam. Npr.
'''js let seznam = [1, 2, 3]; izprazniSeznam(seznam); console.log(seznam); // Izpiše [] '''
Pazi, da ne narediš novega seznama, ampak da izprazniš obstoječega.
Seštevanje matrik
Matrika je v matematiki tabela števil, ki so shranjena v vrsticah in stolpcih. Vsak element v matriki je število. Za reševanje te naloge potrebuješ večdimenzionalne sezname.
Napiši funkcijo sestejMatriki(matrika1, matrika2), ki vrne novo matriko. Kot vhod dobimo dve matriki, ki sta shranjeni v seznamih. Vsak element v seznamu je seznam, ki predstavlja vrstico v matriki. Vsak element v vrstici je število, ki predstavlja element v matriki. Seštevek matrik dobimo, če seštejemo istoležne elemente.
let matrika1 = [
[1, 2, 3],
[3, 2 ,1],
[5, 3, 1]
];
let matrika2 = [
[7, 5, 4],
[6, 5, 4],
[3, 2, 1]
];
console.log(sestejMatriki(matrika1, matrika2));
// [
// [8, 7, 7],
// [9, 7, 5],
// [8, 5, 2],
// ]
Medzvezdice
V 2D seznamu se nahajata dve zvezdici (Označeni z *) ostala polja pa so prazna (Označena z ). Napiši funkcijo medZvezdicama(seznam), ki izpiše razdaljo med zvezdicama. Razdalja je število polj, ki jih je potrebno prehoditi, da prideš od ene zvezdice do druge, brez da bi se premaknila po diagonalah.
let seznam = [
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", "*", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", "*", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " "]
];
console.log(medZvezdicama(seznam)); // Izpiše 5, ker je potrebno prehoditi 5 praznih polj, da prideš od ene zvezdice do druge
Stolpnice
V 2D seznamu se nahajajo stolpnice označene z #. Napiši funkcijo, stolpnice(seznam), ki izpiše višino najvišje stolpnice.
Stolpnice stojijo vsaka v svojem stolpcu. Višina stolpnice je število # v stolpcu.
Stolpnice v primeru imajo višine 3, 2, 8, 2, 2, 3, 1, 1, 2, 1.
let stolpnice = [
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", "#", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", "#", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", "#", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", "#", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", "#", " ", " ", " ", " ", " ", " ", " "],
["#", " ", "#", " ", " ", "#", " ", " ", " ", " "],
["#", "#", "#", "#", "#", "#", " ", " ", "#", " "],
["#", "#", "#", "#", "#", "#", "#", "#", "#", "#"]
];
console.log(stolpnice(stolpnice)); // Izpiše 8, ker je najvišja stolpnica 8 polj visoka
Zaklepajski izrazi
Zaklepajski izrazi so skupki odprtih in zaprtih oklepajev. Nekaj primerov je naštetih spodaj:
"()""()()(())""((((()))))"
naslednji zaklepajski izrazi NISO veljavni, ...
"(""(()"")(""(())))"
Napišite funkcijo veljavenIzraz(izraz), ki preveri, ali je izraz veljaven. Funkcija vrne true, če je izraz veljaven, sicer pa vrne false.
Pomagajte si z funkcijo split, ki razdeli niz na podnize glede na podani znak. vhod.split("") vrne seznam znakov v nizu vhod.
Npr. "(())".split("") vrne ["(", "(", ")", ")"].
let vhod = "((()))";
console.log(veljavenIzraz(vhod)); // Izpiše true
vhod = ")()(";
console.log(veljavenIzraz(vhod)); // Izpiše false
Najdaljši podseznam
V podanem seznamu števil, poišči najdaljši podseznam, ki je urejen naraščajoče.
let vhod = [8, 7, 6, 1, 2, 3];
console.log(najdaljsiPodseznam(vhod)); // Izpiše [1, 2, 3]
let vhod2 = [8, 6, 7, 1, 2, 5, 7];
console.log(najdaljsiPodseznam(vhod2)); // Izpiše [1, 2, 5, 7]
Najdaljša ladja
Najdi največjo ladjo na 10x10 mreži. Ladja je označena kot 1, voda pa kot 0. V vodi je lahko več ladjic, vendar ne smejo se dotikati. Vse so debele 1 polje, vendar imajo lahko različne dolžine.
let mreza = [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 1, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
];
console.log(najdaljsaLadja(mreza)); // Izpiše 6, ker je najdaljša ladja dolga 6 polj