Dodavanje i uklanjanje elemenata JavaScript niza
Osnovna stvar koju moramo umeti da uradimo sa nizom je da u njega dodamo nove elemente, kao i da neke postojeće uklonimo. JavaScript nizovi su veoma fleksibilni. Već smo rekli da članovi niza mogu biti različitih tipova. Takođe, znamo da niz ne moramo da unapred deklarišemo sa nekim predodređenim brojem elemenata kao u drugim programskim jezicima.
Danas ćemo videti da u niz slobodno možemo dodavati elemente, bez razmišljanja o maksimalnom broju elemenata, alokaciji memorije i sličnim stvarima. Takođe, videćemo da neke elemente niza slobodno možemo ostaviti nedefinisanim. Objekat Array se brine o svemu tome umesto nas.
Evo kratkog pregleda metoda koje ćemo danas savladati:
a.push(E) |
Dodaje jedan ili više novih elemenata na kraj niza ['a','b','c'].push('X') ---> 4 // ['a','b','c','X'] |
a.pop() |
Uklanja poslednji elemenat niza i vraća ga kao rezultat. ['a','b','c','d'].pop() ---> 'd' // ['a','b','c'] |
a.unshift(E) |
Dodaje jedan ili više novih elemenata na početak niza. ['a','b','c'].unshift('X') ---> 4 // ['X','a','b','c'] |
a.shift() |
Uklanja prvi elemenat niza i vraća ga kao rezultat. ['a','b','c','d'].shift() ---> 'a' // ['b','c','d'] |
a.splice(I,N,E1,E2,...) |
Uklanja N elemenata počev od indeksa I i umesto njih ubacuje elemente E1, E2... ['a','b','c','d'].splice(1, 2, 'X') ---> ['b','c'] // ['a','X','d'] |
Inače, svi ovde opisani metodi spadaju u tzv. metode mutatore, što znači da menjaju originalni objekat za koji se pozivaju.
Dodavanje elemenata u niz
Element (član niza) u JavaScriptu možemo uvek jednostavno dodati navođenjem novog indeksa.
a[ind] = vrednost
Indeksi čak ne moraju ni da budu poređani - mogu postojati i preskočeni indeksi. Elementi čiji indeksi su preskočeni imaju vrednost undefined. Ovo je relativno jednostavan način, ali ako bismo želeli da nam indeksi budu po redosledu, moramo u nekoj promenljivoj stalno držati broj elemenata niza, ili koristiti sledeći izraz, koji uvek dodaje novi element na kraju niza:
a[a.length] = vrednost
Ovo su sve sasvim legitimni načini dodavanja elementa. Objekat Array nam obezbeđuje posebne i naprednije metode za dodavanje elemenata u niz. Metod push() služi za dodavanje jednog ili više elemenata na kraj niza.
dužina = a.push(e)
dužina = a.push(e1, e2, e3, ...)
[a1, a2, a3, ..., an, e1, e2, e3, ...]
Dodavanje elementa na kraj niza je relativno jednostavno. Međutim, dodavanje elementa na njegov početak nije tako trivijalan zadatak. Ako bismo morali da programiramo, morali bismo da obezbedimo pomeranje svih ostalih elemenata. Srećom, postoji i metod unshift() koji radi upravo to - dodaje jedan ili više elemenata na početak niza. Time će indeksi postojećih elemenata biti promenjeni.
dužina = a.unshift(e)
dužina = a.unshift(e1, e2, e3, ...)
[e1, e2, e3, ..., a1, a2, a3, ..., an]
Oba ova metoda kao rezultat vraćaju novu dužinu niza.
Ako na početku ili na kraju niza imamo preskočene (undefined) elemente, metodi push() i unshift() ih neće popuniti, već će prosto dodati nove elemente. Posle ovih metoda će nam uvek ostati isti broj nedefinisanih elemenata niza.
Primer za dodavanje elemenata
var a = []; // novi niz sa 0 elemenata
a[3] = "Pera";
a[8] = "Mika";
// niz ima 9 elemenata: [-, -, -, "Pera", -, -, -, -, "Mika"]
a.unshift("Žika");
// niz ima 10 elemenata: ["Žika", -, -, -, "Pera", -, -, -, -, "Mika"]
a.push("Joca", "Peđa");
// niz ima 12 elemenata: ["Žika", -, -, -, "Pera", -, -, -, -, "Mika", "Joca", "Peđa"]
Za elemente koji imaju vrednost undefined, navodili smo crtice, da bi bilo preglednije.
Uklanjanje elemenata iz niza
Baš kao što ih dodajemo, tako možemo i ukloniti elemente iz niza. Međutim, ovde moramo koristiti posebne metode. Isto kao i kod dodavanja elemenata, moguće je ukloniti elemenat sa početka, odnosno kraja niza.
Metod pop() uklanja poslednji element niza. Onda, kao rezultat vraća uklonjeni element.
uklonjen = a.pop()
[a1, a2, a3, ..., an-1, ___]
Metod shift() uklanja prvi element niza. Isto kao malopre, posle uklanjanja kao rezultat vraća uklonjeni element.
uklonjen = a.shift()
[___, a2, a3, ..., an]
Prazna mesta u primerima su samo radi lakšeg vizuelnog snalaženja, da biste preimetili odakle je uklonjen element. Inače u nizu ne ostaje prazno mesto. Dužina niza se smanjuje za jedan. Kod metoda shift() se svi indeksi pomeraju za jedan naniže.
Primer za uklanjanje elemenata
var a = ["Pera", "Mika", "Joca", "Žika"]; // novi niz sa 4 elemenata
var x = a.pop(); // x = "Žika"
// a = ["Pera", "Mika", "Joca"]
var y = a.shift(); // x = "Pera"
// a = ["Mika", "Joca"]
splice()
Ovo je kompleksan metod, koji nam omogućava da istovremeno dodajemo i uklanjamo elemente na bilo kom mestu u nizu. Može se zadati u obliku sa dva ili više parametara:
uklonjeni = a.splice(indeks, broj)
uklonjeni = a.splice(indeks, broj, e1,e2,e3...)
Generalno, metod
a.splice(indeks, broj, e1, e2, e3...) | |
---|---|
indeks | Indeks elementa od koga počinje brisanje/dodavanje
|
broj | Broj elemenata koji se uklanjaju, počev od elementa čiji je indeks zadat.
|
e1, e2, e3... | Elementi koji se dodaju.
|
Kao rezultat, ovaj metod vraća niz uklonjenih elemenata. Čak iako se ukloni samo jedan elemenat, biće to niz sa jedinm lementom. Ako se ni jedan elemenat ne ukloni, vraća prazan niz (niz sa bez elemenata).
Primer za uklanjanje elemenata
var a = ["Joca", "Pera", "Mika", "Žika", "Tika"];
var rem = a.splice(1,0, "Maca", "Braca");
// ["Joca", "Maca", "Braca", "Pera", "Mika", "Žika", "Tika"]
// rem = []
rem = a.splice(-2,1);
// a = ["Joca", "Maca", "Braca", "Pera", "Mika", "Tika"]
// rem = ["Žika"]
rem = a.splice(2, 3, "Mića", "Tića");
// a = ["Joca", "Maca", "Mića", "Tića", "Tika"]
// rem = ["Braca", "Pera", "Mika"]
Stek i red
Stek (stack) kao struktura podataka je dobro poznat u programiranju. U pitanju je kolekcija kod koju je moguće dodati ili ukloniti podatak po LIFO principu (Last In First Out). To znači da će podatak koji smo poslednji ubacili na stek, biti prvi koji dobijamo sa njega.
U programiranju se stek koristi za privremeno čuvanje podataka i idealan je za međurezultate operacija, pozive funkcija, rekurziju. Već pretpostavljate da mu je primarna upotreba u programskim jezicima niskog nivoa. Razumevanje funkcionisanja steka je neophodno za programiranje kompajlera (compiler - prevodilac na jezik niskog nivoa).
Red je struktura podataka koja podseća na stek, s tim što podaci dodaju i uklanjaju po FIFO (First In First Out) principu. To znači da najstariji uneti podatak prvi "izlazi" iz strukture.
Ova kolekcija podataka može biti korisna u web programiranju. Na primer, ako korisnik zahteva pristup podacima sa servera, a neophodno je da se zahtevi šalju tek po prispeću prethodnih rezultata, možemo smeštati zahteve u strukturu ovog tipa.
Inače, u programiranju se stek i red se obično simuliraju upotrebom vezanih lista, ali nizovi su u JavaScriptu dovoljno fleksibilni, da pomoću njih na lak način možemo dobiti istu funkcionalnost.
Niz možemo koristiti kao stek upotrebom metoda push() koji dodaje novi element na kraj niza i metoda pop() koji vraća i uklanja poslednji element niza.
a.push(E) // dodavanje na stek
E = a.pop() // čitanje sa steka
Na sličan način možemo simulirati red metodima push() koji dodaje novi element na kraj niza i shift() koji vraća i uklanja prvi element niza.
a.push(E) // dodavanje u red
E = a.shift() // čitanje iz reda
- T. Valentine, J. Reid (2013): JavaScript Programmer's Reference, Apress, New York
- A. Pehlivanian, D. Nguyen (2013): Jump Start JavaScript, SitePoint Pty. Ltd., Collingwood