WEBnSTUDY.com
JavaScript

Pretraga JavaScript niza

Jedan od primarnih programerskih zadataka je traženje određenog elementa unutar niza. I dok postoje različiti algoritmi za pretragu sortiranog niza, ili za pronalaženje podniza, obična, sekvencijalna pretraga (pretraživanje elemenata jedan po jedan) je relativno rutinski (dosadan) zadatak.

Srećom, objekat Array može da pronađe određeni element za nas. Za ove potrebe imamo na raspolaganju dva metoda:

a.indexOf(V,P) U nizu pronalazi prvi elemenat sa vrednošću V, počev od indeksa P i vraća njegov indeks.
a.lastIndexOf(V,P) U nizu pronalazi poslednji elemenat sa vrednošću V, počev od indeksa P i vraća njegov indeks.

indexOf()

Metod indexOf() pronalazi zadatu vrednost u nizu. Kao rezultat vraća indeks pronađenog elementa. Ako se zadata vrednost ne pronađe, rezultat je -1.

Ovaj metod ima dva parametra. Prvi je vrednost koja se traži i taj je obavezan. Parametar početak predstavlja broj indeksa od koga počinje pretraga. Ako se ne navede, podrazumeva se početak niza, tj. vrednost 0.

a.indexOf(vrednost) a.indexOf(vrednost, početak)

Parametar početak može biti i negativan. U tom slučaju se elemenat od koga počinje pretraga odbrojava od kraja niza.

Da bi element bio pronađen, zahteva se striktna jednakost. Drugim rečima, kao kad bismo "ručno" pretraživali kroz niz i upoređivali operatorom ===. To znači da vrednost mora da se poklopi i po tipu.

lastIndexOf()

Metod lastIndexOf() funkcioniše potpuno isto kao indexOf(), s tim što pronalazi zadatu vrednost unazad, počev od kraja, ili od elementa koji zadamo preko parametra početak.

a.lastIndexOf(vrednost) a.lastIndexOf(vrednost, početak)

Pogledajmo par primera.

Primeri pretrage

Pronalaženje drugog i ostalih elemenata

Da vidimo kako bismo pokušali da pronađemo drugu pojavu nekog elementa u nizu.


	var a = [4, 8, 15, 8, 16, 23, 42];

  var val = 8;
  var p = a.indexOf(val);
  if (p > -1) {
    p = a.indexOf(val, p+1);
  }
  console.log(p);   // 3

Najpre pronalazimo prvi indeks tražene vrednosti, i ako je element pronađen, ponovo ga tražimo, ali počev od prve sledeće pozicije.

Ovaj zadatak se lako transformiše u pronalaženje svih pojava zadate vrednosti unutar niza.


  var a = ["Pera", "Mika", "Pera", "Žika", "Ana", "Pera"];
  var ind = [];
    
  var val = "Pera";
  var p = a.indexOf(val);
  while (p > -1) {
    ind.push(p);
    p = a.indexOf(val, p+1);
  }
  console.log(ind);   // [0, 2, 5]

Niz ind će biti niz svih indeksa elemenata koji su jednaki zadatom stringu.

Negativan početak

Ovde demonstriramo kako izgleda pretraga kada zadamo negativan početak. Dakle, ako zadamo -1, to znači, poslednji (prvi od kraja), -2 je pretposlednji, odnosno drugi od kraja, itd.


  var a = ["Pera", "Ana", "Pera", "Žika", "Ana", "Pera"];

  var p = a.indexOf("Ana", -3);  // počinje od elementa "Žika"
  console.log(p);   // 4

Pretraga unazad

Još je ostalo da vidimo kako funkcioniše pretraga unazad.


  var a = ["Pera", "Ana", "Pera", "Žika", "Ana", "Pera"];

  var p = a.lastIndexOf("Ana");  // počinje od kraja i ide unazad
  console.log(p);   // 4

Kada pretraga ne pomaže

Pronalaženje svih stringova

Ovo je problem kada pokušavamo da pronađemo sve stringove u nizu koji počinju određenim podstringom.


	var a = ["Pera", "Mika", "Paja", "Maca", "Žika", "Ivica", "Mile"];

  var val = "M";   // tražimo sve stringove koji počinju na "M"
  var ind = a.reduce(function(rez, elem, i) {
    if (elem.indexOf(val) == 0) 
      rez.push(i);
    return rez;
  }, []);
  console.log(ind);   // [1, 3, 6]

Pronalaženje prvog objekta

U ovom primeru demonstriramo kako bismo pronašli indeks prve pojave određenog objekta. Recimo da imamo niz objekata, gde svaki objekat ima dva numerička svojstva x i y. Treba da pronađemo prvi element niza kod koga je vrednost x jednaka nekom broju.


	var a = [{x:5, y:1}, {x:9, y:4}, {x:1, y:8}, {x:7, y:1}, {x:9, y:2}];

  var val = 9;  // vrednost x koja se traži
  var ind = -1;
  a.some(function(elem, i) {
    if (elem.x == val) {
      ind = i;
      return true;
    }
    return false;
  });
  console.log(ind);   // 1

Ovako nešto ne možemo postići sa običnom pretragom. Jednostavno, metodi indexOf() i lastIndexOf() nisu dovoljno moćni.


	var a = [{x:5, y:1}, {x:9, y:4}, {x:1, y:8}, {x:7, y:1}, {x:9, y:2}];

  // ovako ne može
  var p = a.indexOf({x:9, y:4});
  console.log(p);   // -1

  var o = a[3];     // može da izjednači samo ako je u pitanju referenca na isti objekat
  p = a.indexOf(o);
  console.log(p);   // 3

Iako zadati objekat naizgled postoji u nizu, to nije isti objekat. Jedino upoređivanje objekata koje može da nam vrati pozitivan rezultat je kada uporedimo dve reference istog objekta, što nam je u pretrazi više-manje beskorisno.

Ako vas zanima da naučite nešto više o ovim novim metodima koje smo ovde koristili, pročitajte već pomenuti tekst o iteracijama kroz niz.

  1. T. Valentine, J. Reid (2013): JavaScript Programmer's Reference, Apress, New York
  2. A. Pehlivanian, D. Nguyen (2013): Jump Start JavaScript, SitePoint Pty. Ltd., Collingwood
Svi elementi sajta Web'n'Study, osim onih za koje je navedeno da su u javnom vlasništvu, vlasništvo su autora i ne smeju se koristiti, u celosti ili delimično bez pismenog odobrenja autora. To uključuje tekstove, slike, ilustracije, animacije, prateći grafički materijal i programski kod.
Ovaj sajt koristi tehnologiju kolačića (cookies) radi vođenja interne statistike u cilju unapređenja korisničkog iskustva. Tako prikupljeni podaci su anonimni i nedostupni trećim licima. Vaša privatnost nije ugrožena ni na koji način.