- Konu sahibi
- #1
JavaScript’te
Metindeki indeks, eşleşen parçanın ilk karakterini gösterir. Örneğin
Bu örnekte sonuç 0 olsa bile koşul doğru çalışır. Yalnızca elemanın konumu gerekiyorsa dönen indeksi saklayıp sonraki işlemde kullanabilirsiniz.
İkinci parametre olan
İlk çağrı 0. indeksteki
Arama yöntemini seçerken temel farklar şöyledir:
Dizi aramasında değerler katı eşitlik mantığıyla karşılaştırılır. Bu yüzden
İki nesnenin
a".indexOf("a") sonucu 2’dir. İndeksi kullanıcıya görünen karakter sayısı gibi yorumlamayın; arayüzde karakter düzeyinde işlem gerekiyorsa Unicode metin bölütleme ihtiyacını ayrıca ele alın.
indexOf(), bir metnin veya dizinin içinde aranan değerin ilk bulunduğu konumu bulur. Sonuç, sıfırdan başlayan bir indeks numarasıdır. Değer bulunamazsa -1 döner. Bu nedenle en yaygın kullanım, bir değerin mevcut olup olmadığını kontrol etmektir.String ve Array üzerinde kullanımı
string.indexOf(aranan) metin içindeki ilk eşleşmenin başlangıç indeksini verir. Büyük-küçük harf duyarlıdır. array.indexOf(aranan) ise dizide aranan elemanın ilk eşleştiği konumu döndürür.
Kod:
const metin = "JavaScript öğreniyorum";
const konum = metin.indexOf("Script");
console.log(konum); // 4
console.log(metin.indexOf("Python")); // -1
const diller = ["HTML", "CSS", "JavaScript", "JavaScript"];
console.log(diller.indexOf("JavaScript")); // 2
Metindeki indeks, eşleşen parçanın ilk karakterini gösterir. Örneğin
JavaScript içinde Script ifadesi 4. indeksten, yani sıfırdan sayıldığı için beşinci karakterden başlar; çünkü J karakterinin indeksi 0’dır. Dizide ise indeks, elemanın bulunduğu sıra numarasıdır.Sonuç nasıl yorumlanır?
indexOf() sonucu doğrudan koşulda kullanılabilir; ancak yalnızca if (sonuc) biçimindeki kontrol hatalıdır. Çünkü bulunan değer ilk sıradaysa sonuç 0 olur ve JavaScript bunu yanlış kabul eder. Doğru kontrol, sonucu -1 ile karşılaştırmaktır.
Kod:
const roller = ["admin", "editor", "uye"];
const arananRol = "admin";
if (roller.indexOf(arananRol) !== -1) {
console.log("Rol listede bulunuyor.");
} else {
console.log("Rol listede bulunmuyor.");
}
Bu örnekte sonuç 0 olsa bile koşul doğru çalışır. Yalnızca elemanın konumu gerekiyorsa dönen indeksi saklayıp sonraki işlemde kullanabilirsiniz.
Arama başlangıç konumunu belirleme
İkinci parametre olan
fromIndex, aramanın hangi indeksten başlayacağını belirtir. Bu parametre verilmezse arama 0. indeksten başlar. Böylece ilk eşleşmeyi atlayarak sonraki eşleşmeyi arayabilirsiniz.
Kod:
const sayilar = [10, 20, 10, 30];
console.log(sayilar.indexOf(10)); // 0
console.log(sayilar.indexOf(10, 1)); // 2
İlk çağrı 0. indeksteki
10 değerini bulur. İkinci çağrı ise 1. indeksten itibaren arama yaptığı için 2. indeksteki değeri döndürür. Metinlerde de aynı yaklaşım geçerlidir.Arama yöntemini seçerken temel farklar şöyledir:
| İhtiyaç | Uygun kullanım | Sonuç |
|---|---|---|
| İlk eşleşmenin konumu | indexOf() | İndeks veya -1 |
| Değerin bulunup bulunmadığı | indexOf() !== -1 | true veya false mantığı |
| Son eşleşmenin konumu | lastIndexOf() | Son indeks veya -1 |
| Koşula uyan elemanı arama | findIndex() | Koşulu sağlayan indeks veya -1 |
Sık yapılan hatalar ve sınırlamalar
indexOf() eşleşmeyi büyük-küçük harfe duyarlı arar. "JavaScript".indexOf("javascript") sonucu bu nedenle -1 olur. Büyük-küçük harfi önemsemeyen arama gerekiyorsa karşılaştırmadan önce iki tarafı da toLowerCase() veya uygun bir metin normalleştirme yöntemiyle dönüştürün.Dizi aramasında değerler katı eşitlik mantığıyla karşılaştırılır. Bu yüzden
NaN için indexOf() beklenen eşleşmeyi vermez. Ayrıca nesnelerde içerik değil, aynı nesne referansı aranır:
Kod:
const birinci = { id: 1 };
const ikinci = { id: 1 };
console.log([birinci].indexOf(birinci)); // 0
console.log([birinci].indexOf(ikinci)); // -1
İki nesnenin
id değeri aynı olsa da nesneler farklı referanslardır. Nesne özelliğine göre arama yapmak için findIndex() gibi koşullu bir yöntem kullanın. Büyük bir dizide tekrar tekrar arama yapılıyorsa ve yalnızca üyelik kontrolü gerekiyorsa Set.has() daha uygun bir veri yapısı olabilir; konum gerekiyorsa indexOf() kullanmaya devam edin.