Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
JavaScript’te map(), bir dizinin her elemanı üzerinde aynı dönüşümü çalıştırıp sonuçlardan yeni bir dizi oluşturan dizi metodudur. Bu rehber büyük M ile yazılan anahtar-değer koleksiyonu Map'i değil Array.prototype.map metodunu anlatır. Metodun kendisi kaynak diziyi doğrudan değiştirmez; callback fonksiyonunun döndürdüğü değer, yeni dizinin ilgili elemanı olur.

Örneğin bir sayı dizisindeki değerlerin karesini almak için:

Kod:
const sayilar = [1, 2, 3, 4];
const kareler = sayilar.map((sayi) => sayi * sayi);

console.log(kareler);

Beklenen çıktı:

Kod:
[1, 4, 9, 16]

Burada map() her sayı için callback’i bir kez çalıştırır. Callback’in döndürdüğü sayi * sayi sonuçları kareler dizisine sırasıyla eklenir. sayilar dizisi ise aynı kalır.

map nasıl çalışır?​


map() callback fonksiyonuna en fazla üç bilgi verir:

  • İlk parametre: İşlenen elemanın değeri.
  • İkinci parametre: Elemanın dizideki indisi.
  • Üçüncü parametre: Üzerinde işlem yapılan kaynak dizi.

İndisi kullanarak etiket üretmek gibi işlemler de yapılabilir:

Kod:
const urunler = ["Kalem", "Defter", "Çanta"];

const etiketler = urunler.map((urun, indis) => {
  return `${indis + 1}. ${urun}`;
});

console.log(etiketler);

Çıktı şöyledir:

Kod:
["1. Kalem", "2. Defter", "3. Çanta"]

Her callback çağrısında bir değer döndürmek önemlidir. Süslü parantez kullanılan arrow function içinde return yazılmazsa callback undefined döndürür:

Kod:
const sayilar = [1, 2, 3];

const hatali = sayilar.map((sayi) => {
  sayi * 2;
});

console.log(hatali);

Sonuç [undefined, undefined, undefined] olur. Doğru kullanım ya açıkça return yazmak ya da tek satırlı ifadede süslü parantez kullanmamaktır:

Kod:
const dogru1 = sayilar.map((sayi) => {
  return sayi * 2;
});

const dogru2 = sayilar.map((sayi) => sayi * 2);

map, filter ve forEach farkı​


Hangi metodu seçeceğiniz, işlem sonunda yeni bir diziye ihtiyaç duyup duymadığınıza bağlıdır.

MetotTemel amacıSonuç
map()Her elemanı dönüştürmekAynı uzunlukta yeni dizi
filter()Koşulu sağlayanları seçmekDaha kısa veya aynı uzunlukta yeni dizi
forEach()Her eleman için yan etki çalıştırmakKullanışlı bir dizi sonucu yoktur

Örneğin fiyatları dönüştürmek için map(), yalnızca stokta olan ürünleri seçmek için filter(), sonuç üretmeden log yazmak için forEach() daha uygun seçimdir. Bir diziyi hem filtreleyip hem dönüştürmek gerekiyorsa metotlar zincirlenebilir:

Kod:
const fiyatlar = [50, 120, 200, 80];

const indirimli = fiyatlar
  .filter((fiyat) => fiyat >= 100)
  .map((fiyat) => fiyat * 0.9);

console.log(indirimli);

Çıktı [108, 180] olur. Önce 100 ve üzerindeki fiyatlar seçilir, ardından seçilen değerler yüzde 10 azaltılır.

Kullanım adımları ve dikkat edilmesi gerekenler​


  1. Yeni dizide her kaynak elemanı için hangi değerin bulunacağını belirleyin.
  2. Kaynak dizinin ardından .map() yazın ve callback fonksiyonunu verin.
  3. Callback içinde yeni elemanı döndürün; gerekiyorsa değer, indis veya kaynak dizi parametrelerini kullanın.
  4. Dönen yeni diziyi bir değişkene atayın ya da doğrudan sonraki bir işlemde kullanın.
  5. Sonucu console.log() ile kontrol edin. Beklenmeyen undefined değerleri genellikle eksik return kullanımına işaret eder.

Metot genellikle dizide kullanılır, ancak teknik olarak generic'tir: length ve sayısal özellikleri olan array-like değerlere call ile uygulanabilir. Başlangıçta böyle bir veriyi Array.from ile diziye çevirip map çağırmak daha açık olabilir. Boş yuvalı dizide callback boş yuvalar için çağrılmaz. Ayrıca yalnızca yan etki yapmak için map() kullanmak yerine forEach() tercih edin. Callback içinde dışarıdaki değişkenleri değiştirmek mümkün olsa da bu yaklaşım kodun izlenmesini zorlaştırabilir; dönüş değerini üretmeye odaklanmak daha okunaklıdır.

Sık sorulan sorular​


map içinde async fonksiyon kullanınca sonuç hemen veri olur mu?​


Hayır. Callback async ise yeni dizinin elemanları Promise olur; map bu işlemleri beklemez. Birlikte sonuç almak için Promise.all kullanılabilir. Çok büyük bir listede bu yaklaşım çok sayıda eşzamanlı işlem başlatabileceğinden gerektiğinde eşzamanlılığı ayrıca sınırlayın.

Büyük harfle Map ile küçük harfle map aynı özellik mi?​


Hayır. Map, anahtarlara karşılık değer saklayan koleksiyondur; set/get gibi metotları vardır. Array.map ise eleman dönüştürüp yeni dizi üretir. Hangisinin gerektiğini yalnız ada değil işleme bakarak seçin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.