Algoritam za izbor metode pri radu sa nizovima

Uz pomoć narednog snippeta koji je napisala Sarah Drasner, korišćenjem jednostavnog algoritma dolazimo do odgovarajuće metode:

See the Pen Array Explorer by Web programiranje (@chos) on CodePen.


Da li je ulaz niz?

Problem provere tipa podatka se zasniva na činjenici da se pri korišćenju metode toString() niz prebacuje u sledeći string: “[object Array]”.

Prečišćavanje elemenata niza

U sledećem snippet-u je prikazana funkcija koja eliminiše “nepoželjne” članove niza: null, “”, false, undefined i NaN.

Razlike u dva niza

U sledećem snippet-u prikazano rešenje nalazi sve članove niza koji se ne nalaze u oba niza.

Brisanje duplikatnih vrednosti u nizu

a) Niz primitiva

Prebacivanje niza u privremeni objekat (vrednosti niz u ključeve objekta), zatim vršiti iteracije kroz ključeve objekta sa operatorom in:

Ovaj pristup ne održava redosled i ne razlikuje broj od “broj” (1 == “1”)

Ovde se koristi metoda filter() koja uzima callback funkciju kao argument. Callback funkcija testira svaki član niza (prema nekom uslovu), i ako je uslov ispunjen ubacuje (vraća) element u novi niz. Callback funkciji se automatski prosledjuju tri parametra currentValue, index, nizDuplikata.
U našem uslovu se koristi funkcija indexOf() koja pretražuje niz i nalazi index člana niza na osnovu njegove vrednosti. Ukoliko se indeks niza dobijen korišćenjem metode nizDuplikata.indexOf(currentValue) poklapa sa trenutnim indeksom to znači da nije bilo takve vrednosti. Ukoliko postoje dve iste vrednosti u nizu, pri pretrazi sa metodom indexOf() prva vrednost će da “prodje” uslov, dok druga neće jer će vratiti indeks od prve vrednosti, što se neće poklopiti sa trenutnim indeksom.

Set je nova vrsta kolekcije podataka koja se pojavila sa ES6. Glavna karakteristika ove kolekcije je da sadži samo jedinstvene vrednosti u kolekciji.

Postupak:
Prvo se napravi set objekat koji ima jedinstvene vrednosti, zatim se sa for..of iteracijom kroz set objekat napravi niz. Ovaj postupak je mogao da se “skrati” korišćenjem ES6 metode from() koja pravi niz:

b) Niz objekata

Za razliku od primitiva koji se čuvaju prema vrednosti, objekti se čuvaju prema referenci, stoga prethodni pristupi neće dati dobre rezultate.

Za pronalaženje duplikata niza koristićemo metodu filter() koja pravi novi niz od elemenata niza koji su prošli neki test i vratili TRUE. Pri punjenju pomoćnog objekta sa parovima key/value (ključ/vrednost), svaki ključ se konvertuje u string, stoga ne možemo da razlikujemo broj 1 od string-a “1”. Ali korišćenje izraza JSON.stringify(el) nam omogućava da se ipak razlikuju. Ovaj izraz vraća različite vrednosti u zavisnosti od tipa, što se vidi na sledećem primeru:

Spajanje dva niza

Spajanje dva niza (sa duplikatima)

Spajenje dva niza u novi niz sa metodom concat() generiše novi niz. Medjutim ova metoda nije dobra kod velikih nizova jer troši resurse kreiranjem novog niza.

Metoda push() ne generiše novi niz, pa je zbog toga štedljivija po pitanju resursa u odnosu na metodu concat(), pa je ova metoda preporučena u slučaju rada sa velikim nizovima. Medjutim ovaj način ima ogranjičenje, niz koji se dodaje (u ovome slučaju array2) ne može da ima veći broj članova od maksimalnog broj parametara koje funkcija može da primi (Chrome33: 65535, Firefox27:262143, IE11: 131071, Opera12: 1048576).

ili

Napomena: Pogledajte ovde zbog čega se koristi apply() metoda u prethodnim izrazima.

Spajanje dva niza je jednostavno korišćenjem spread opteratora:

Spajanje dva niza (bez duplikata)

Pravljenje klona niza

Ukoliko želimo da napravimo novi niz koji će da zauzme novo mesto u memoriji pri čemu će da sadrži kopiju nekog niza u ovom trenutku, koristićemo sledeći snippet:

Dobijanje poslednjih članova niza

Poslednji članovi niza se dobijaju koristeći metodu slice() ali sa negativnim argumentom -1:

Pronalaženje člana niza prema vrednosti

U sledećem snippet-u se koristi metoda indexOf() koja vraća index traženog elementa koji se nalazi u nizu ili vraća vrednost -1 ako ga niz ne sadrži. Ukoliko se u metodi indexOf() koriste dva atributa onda drugi atribut definiše od kog index-a da se počne pretraga.

Primer

Uklanjanje odredjenog člana niza

Uklanjanje odredjenog člana niza izabranog prema vrednosti člana:

Pražnjenje niza

Kod ovog načina treba obratiti pažnju da se na ovaj način briše sadržaj memorije na koju referenca te promenjive ukazuje, pa ako postoji još neka promenjiva koja ima istu referencu na taj deo memorije i kod nje će doći do izmene.

Ovaj način koristimo ukoliko želimo da obrišemo članove niza ali da ne obrišemo referencu. Izraz “niz=[]” dodeljuje novi prazan niz promenjivoj i ne utiče na druge reference. Treba napomenuti da ovaj način troši memoriju jer je mesto u memoriji gde je čuvan stari niz još uvek zauzeto starim podacima o nizu.

Sortiranja

Sortiranje niza stringova

Sortiranje liste

See the Pen JS sort list by Web programiranje (@chos) on CodePen.


See the Pen Sortiranje liste jQuery by Web programiranje (@chos) on CodePen.


Sortiranje niza brojeva

Metoda sort()je inicijalno namenjena za sortiranje niza stringova, stoga pri sortiranju niza brojeva daje pogrešne rezultate.

Rešenje

Za korišćenje sa brojevima je potrebno dodati funkciju poredjenja.

js sort algoritam

js sort algoritam
js sort algoritam

js sort algoritam

js sort algoritam
js sort algoritam

js sort algoritam

Max i min niza

Najmanji član niza

ES5 način

ES6 – spread operator

ES6 – Spread operator + arrow funkcija

ili još preglednije napisano sa arrow funkcijom:

Najveći član niza

Suma niza

Prosečni član niza

Mešanje redosleda elemenata niza

Metoda sort() uzima za parametar callback funkciju koja “funkcija za poredjenje” (ili negativan broj ili nulu ili pozitivan broj), metoda sort() zna koji je broj veći, a koji je manji. Stoga ako “zeznemo” sort() metodu i vraćamo joj slučajne rezultate i ona će da vrati slučajno izmešane brojeve niza.

Ovaj način koristi Fisher–Yates algoritam:

Izvlačenje random člana niza

Prebacivanje niza u listu elemenata

Neke ugradjene funkcije u JavaScript-u npr. Math.max() ne prihvataju niz kao argument već listu. Stoga se javlja potreba da transformišemo niz u listu, a to možemo uraditi na sledeće načine:

Funkcija apply() može da prihvati niz kao argument, pa iako joj to nije glavna namena, često se koristi da “pretvori” niz u listu argumenata. Prvi argument apply() funkcije mora da bude objekat na koji ukazuje this ključna reč (ovo je primarna namena funkcije apply), a drugi je niz koji se prosledjuje callback funkciji kao lista argumenata.

Primer

U sledećem primeru funkcija Math objekta prihvata samo listu argumenata (ne i niz), pa se pre nje koristi apply():

Primer

Metodi push() je potrebno da se prosledjuje lista elemenata u vidu alrgumenata, kao na sledećem primeru:.

Medjutim ako želimo da prosledimo ceo niz, potrebno je da ka prosledimo kao listu, a za to ćemo koristi apply() metodu koja očekuje kao drugi argument listu, pa će implicitno prebaciti niz u listu:

Ovaj način zahteva korišćenje ES6 spread operator-a:

Podelite:

Ostavite komentar