Kurs: - Core JavaScript Programming
Modul: Rad sa podacima
Autor: Vladimir Marić
Naziv jedinice: Rad sa nizovima
Materijali vezani uz ovu lekciju:
-
Test rad sa nizovima -
Rad sa nizovima (PDF dokument)
Nizovi su još jedan od ključnih elemenata u programiranju i teško da bi se bez njih mogla zamisliti neka ozbiljnija funkcionalnost. Oni su, zapravo, ništa drugo do tipovi podataka, poput svih ostalih tipova, s tom razlikom što u sebi nose složenu strukturu, a kada to kažemo, obično mislimo na tipove koji zapravo i ne sadrže vrednost, već samo lokaciju u memoriji, na kojoj se ta vrednost nalazi, dok se sami podaci, rasprostiru po memoriji, od naznačene lokacije pa nadalje.
Šta je konkretno niz? Niz je jedan skup podataka istog tipa, od kojih se svaki nalazi na određenoj indeksiranoj poziciji.
Na primer, ako imamo jedan skup brojeva 3,5,2,6,1,6, primećujemo da se broj 6 ponavlja. To znači da, ako bismo rekli da želite da iz liste izvučemo broj 6, ne bismo imali preciznu informaciju o kom se od ta dva moguća broja šest, zapravo, radi. Jedan od načina da se ovo reši, bio bi uvođenje numeracije elemenata ovog skupa:
broj: 3,5,2,6,1,6
pozicija: 1,2,3,4,5,6
U ovom slučaju možemo vrlo jednostavno da identifikujemo svaki broj u svakom trenutku. I ako bismo želeli da prikažemo neki od brojeva 6, mogli bismo da prosledimo jednu od dve pozicije (4 ili 6). Po istom principu funkcionišu i nizovi.
Postoji više načina da inicijalizujemo jedan niz. Možemo da ga deklarišemo sa ili bez inicijalne veličine (broja elemenata).
var niz = new array();
ili
var niz = new array(10);
drugi primer nema baš naročit smisao, zbog toga što, za razliku od nižih programskih jezika (c,c++...), JavaScript ne mora imati unapred određenu veličinu niza, jer se niz može dinamički povećavati prema potrebama.
Takođe, možemo upotrebiti i skraćenu notaciju za inicijalizaciju niza:
var niz = [];
koja je analogna prvoj verziji prethodnog primera.
Niz takođe možemo inicijalizovati i sa već unešenim vrednostima. Na primer, ako bismo želeli da inicijalizujemo niz, koji bi sadržao naš skup brojeva sa početka ove lekcije, napisali bismo:
var niz = [3,5,2,6,1,6];
Ovo je pravi trenutak da skrenemo pažnju na jednu bitnu stvar koja se tiče nizova, odnosno, numeracije njegovih elemenata. A to je da, niz koji smo upravo inicijalizovali ne bi u potpunosti odgovarao numeraciji sa početka lekcije. Ona bi zapravo izgledala ovako.
broj: 3,5,2,6,1,6
pozicija: 0,1,2,3,4,5
jer se u nizovima koristi takozvana „Zero based“ numeracija.
Osim ove, postoji još jedna stvar koju smo “slagali“ na početku lekcije. Naime, rekli smo da je niz skup podataka istog tipa. Ovo jeste generalna definicija niza, ali ne mora biti poštovana u JavaScript-u. Da bismo ovo analizirali, prvo ćemo naučiti kako da preuzmemo podatak iz niza.
Jednostavno, podatak iz niza se dobija imenom niza i prosleđivanjem broja indeksa (numeracije) u uglastoj zagradi.
Npr:
x=niz[3];
dodeliće promenljivoj x vrednost iz niza numerisanu pod brojem 3. Odnosno, to će, ako budemo rukovali nizom 3,5,2,6,1,6 biti broj 6 (četvrti po redu, zbog strukture bazirane na nuli).
Na sličan način mogli bismo i da smestimo neku vrednost u niz:
niz[3]=5;
Posle čega bi četvrti član niza nosio vrednost 5.
Vratimo se sada na tipove u samom nizu.
Malopre smo rekli da niz može i ne može da primi različite tipove. Pokušajmo da izmenimo malo naš niz, tako da jedan od tipova ne bude brojni nego String tip:
var niz = [3,"5",2,6,1,6];
document.write(niz[0]+1);
Rezultat ovog koda biće 4, ali ako bismo zatražili drugi element niza:
var niz = [3,"5",2,6,1,6];
document.write(niz[1]+1)
rezultat bi bio 51, što je potpuno logično, jer u prvom slučaju interpreter rukuje operacijom sabiranja nad brojevima, dok u drugom, konkatinacijom, odnosno, nadovezivanjem String-ova.
Na pitanje, kako to da niz, koji ne dozvoljava mešanje tipova, ipak može da funkcioniše sa različitim tipovima, odgovor je, da su ti tipovi u nizu stvarno zapisani kao isti, odnosno, interpreter ih, pre nego što ih stavi u niz, pretvori u tip objekat, a pri vađenju iz niza, konvertuje u njihov izvorni tip.
Ova procedura, koja zapravo i ne mora da nas se tiče, sve dok pazimo sa kojim tipovima rukujemo, naziva se Boxing i Unboxing.
Kada se govori o nizovima, najčešće se razlikuju dve vrste nizova. Pomenuta struktura, koja podrazumeva brojčanu numeraciju elemenata niza naziva se numerički ili indeksirani niz i struktura u kojoj svaki element niza poseduje ključ koji ga identifikuje, odnosno, asocijativni niz.
var niz=[];
niz['srbija']='beograd';
niz['francuska']='pariz';
niz['engleska']='london';
document.write(niz['francuska']);
Primer predstavlja asocijativni niz, jer se vrednosti kriju ispod ključeva (države su ključevi, a gradovi su vrednosti). Do vrednosti se, u ovakvom nizu, dolazi prilaganjem ključa u uglastu zagradu promenljive, kao na primeru.
Do sada smo ustanovili kako da stavimo element u niz i kako da pročitamo element iz niza. Ali, ove procedure i nisu baš previše automatične i ne razlikuju nizove od ostalih promenljivih. Zbog toga, prava moć nizova dolazi do izražaja tek kada se njima rukuje kroz različite vrste petlji.
Iako još uvek nismo obradili petlje, pogledajmo sledeći primer (potrebno je dodati ga na prethodni kod):
for (i in niz)
{
document.writeln(i+':'+niz[i]+'<br>');
}
Ovaj primer će izlistati sve članove malopređašnjeg asocijativnog niza i emitovati ih na stranu. Ako primer od tri države možda nije dovoljno slikovit, zamislimo neki ogroman niz od npr. 1000 elemenata, koji je došao sa nekog spoljašnjeg izvora podataka i rukovanje podacima iz tog izvora kroz ovakav niz, umesto ručno.
Ceo sadržaj niza uvek možemo prikazati i funkcijom document.write(niz) (ali njome nećemo stići dalje od pukog pregledavanja sadržaja niza).
Ozbiljnije rukovanje nizovima kroz petlje, ostavićemo za jednu od narednih lekcija koja se bavi kontrolom toka programa.
Svojstva i funkcije nad nizovima
Nakon prve upotrebe niza, osetićemo potrebu da saznamo neke njegove osnovne osobine. Generalno, ukoliko smo u stanju da pročitamo niz (kao u prethodnom primeru), lako ćemo doći do njih. Ipak, većina programskih jezika podrazumeva ovakvu potrebu programera i sadrži ugrađeni paket svojstava i funkcija za rukovanje nizovima. Ove su funkcije i svojstva u većini jezika isti po funkcionalnosti, samo se ponekad drugačije zovu.
Neke od tih funkcija i svojstava obradićemo u ovoj i narednoj lekciji.
Length
Prva potreba koja se ukazuje pri radu sa nizovima je potreba za izračunavanjem veličine samog niza, odnosno broja njegovih članova. Ovaj podatak je lako dobiti svojstvom length:
var niz=[3,5,2,6,1,6];
document.write(niz.length);
Rezultat je 6.
Treba obratiti pažnju da indeks niza nije isto što i broj elemenata niza, što često ume da zbuni, iako je logično. U ovom slučaju, broj elemenata niza (Length) je 6 iako je poslednji indeks niza, zapravo 5.
Svojstvo Length omogućava lako pronalaženje prvog praznog mesta u nizu (ukoliko želimo da dodamo još vrednosti u niz).
niz[niz.length]=6;
Dodaje još jednu šesticu na postojeći niz, pa je niz sada 3,5,2,6,1,6,6
concat() - Ova funkcija omogućava dodavanje određenih elemenata već postojećem nizu.
Primer:
var niz=[3,5,2,6,1,6];
niz=niz.concat(3,3,3);
identičan je, kao da smo napisali:
var niz=[3,5,2,6,1,6];
niz[6]=3;
niz[7]=3;
niz[8]=3;
sort() - Sortira niz po veličini članova.
var niz=[3,5,2,6,1,6];
niz=niz.sort();
nakon izvršene funkcije, niz će izgledati ovako: 1,2,3,5,6,6
splice() - Izbacuje članove niza određene parametrima funkcije
Posle sledećeg koda:
var niz=[7,2,3,4,5];
niz.splice(0,2);
u nizu će ostati samo brojevi 3,4 i 5 jer je u parametrima naznačeno da se iz niza izbacuju 2 člana od indeksa 0.
Ovom funkcijom možemo izvršiti i inverzan proces (zadržati u nizu samo naznačene članove), ukoliko rezultat funkcije prosledimo u niz. Tako će sledeće linije:
var niz=[7,2,3,4,5];
niz=niz.splice(0,2);
rezultirati nizom od 2 člana, počevši od člana 0 (7 i 2).
Logično da je ovo jedan od načina da obrišemo određeni element niza. Npr:
niz.splice(2,1);
Obrisaće element sa indeksom 2.
reverse()
Menja redosled elemenata niza, tako da poslednji bude prvi, a prvi poslednji:
niz = [1,2,3,4,5,6,7];
document.write(niz.reverse());
Rezultat je niz 7,6,5,4,3,2,1
Vežba 1
Problem:
Postoje dva niza. Jedan niz (arr) sadrži imena, a drugi, asocijativni niz (arr1) sadrži imena i prezimena. U aplikaciju ulazi indeks prvog niza (arr) kroz promenljivu ulaznaVrednost.
Potrebno je pronaći prezime u nizu arr1 na osnovu imena koje se nalazi na poziciji čiji je indeks ulaznaVrednost i dodeliti ga promenljivoj izlaznaVrednost. Vrednost ove promenljive potrebno je emitovati na izlaz (alert ili document.write))
var ulaznaVrednost=1;
var arr = ["Petar","Jovan","Goran"];
var arr1 = {"Petar":"Petrovic","Jovan":"Jovanovic","Goran":"Maric"};
Rešenje:
var ulaznaVrednost = 1;
var arr = ["Petar","Jovan","Goran"];
var arr1 = {"Goran":"Maric","Jovan":"Jovanovic","Petar":"Petrovic"};
var izlaznaVrednost = arr1[arr[ulaznaVrednost]];
alert(izlaznaVrednost);
Vežba 2
Problem:
Date su sledeće promenljive:
var minimum = 3;
var maximum = 5;
var arr = [2,5,3,7,1,9,3,4,5,7,1];
Potrebno je napraviti program koji će sortirati niz od najvećeg broja ka najmanjem, a zatim izbaciti iz niza sve vrednosti koje počinju od indeksa 3 i završavaju sa indeksom 5. Ovako obrađen niz potrebno je emitovati na izlaz.
var minimum = 3;
var maximum = 5;
var arr = [2,5,3,7,1,9,3,4,5,7,1];
arr.sort();
arr.reverse();
arr.splice(minimum,maximum-minimum+1);
alert(arr);
Najvažnije iz lekcije:
- Niz je numerisana lista podataka.
- Za svakog člana niza postoji određeni indeks koji identifikuje njegovu lokaciju.
- Indeksiranje članova niza se bazira na nuli, tako da prvi član niza ima indeks 0.
- U JavaScript-u nizovi se mogu sastojati od istih ili različitih tipova.
- Dužinu niza (broj članova) moguće je u svakom trenutku dobiti svojstvom length.