`Map` Nesnesi
Bu makale, Map nesnesini açıklar.
Temel işlemlerden, gerçek dünyada işe yarayan pratik örneklere kadar adım adım açıklayacağız.
YouTube Video
Map Nesnesi
Map, anahtar-değer çiftlerini depolayan bir koleksiyondur. Bir nesneye benzer, ancak farkı nesneler, fonksiyonlar veya primitifler gibi herhangi bir türün anahtar olarak kullanılabilmesi ve ekleme sırasının korunmasıdır.
Map Temelleri
Öncelikle bir Map'in nasıl oluşturulduğuna ve temel işlemlerin nasıl yapıldığına bakalım.
Aşağıdaki kod, boş bir harita oluşturan, anahtarlar ekleyen ve değerleri alan minimal bir örnektir.
1// Create an empty Map and add key-value pairs
2const m = new Map();
3m.set('a', 1);
4m.set('b', 2);
5
6console.log(m.get('a')); // 1
7console.log(m.size); // 2
- Bu kodda,
setile öğe ekleyebilir,getile değer alabilir vesizeile öğe sayısını kontrol edebilirsiniz. Map, ekleme sırasını koruyarak, sıra bağımlı işlemler için uygun hale gelir.
set, get, has ve delete Davranışı
İşte tipik okuma, yazma, varlık kontrolü ve silme işlemlerinin örnekleri.
Aşağıdaki kodla, her yöntemin dönüş değerini ve etkisini kontrol edebilirsiniz.
1// Demonstrate set, get, has, and delete
2const m2 = new Map();
3m2.set('x', 10);
4console.log(m2.has('x')); // true
5console.log(m2.get('y')); // undefined
6
7m2.delete('x');
8console.log(m2.has('x')); // false
9
10// set returns the map itself, allowing method chaining
11m2.set('a', 1).set('b', 2);
12console.log(m2); // Map { 'a' => 1, 'b' => 2 }
- Anahtar yoksa,
getfonksiyonuundefineddöndürür.has, bir anahtarın var olup olmadığını kontrol eder vedeletebir anahtarı kaldırır. - Ayrıca,
setfonksiyonu kendisini döndürdüğü için, fonksiyon zincirleme mümkündür.
Herhangi bir tür, anahtar olarak kullanılabilir (nesneleri anahtar olarak kullanmak)
Map'in başlıca avantajlarından biri, nesnelerin doğrudan anahtar olarak kullanılabilmesidir.
Aşağıdaki örnek, Map'te nesneleri anahtar olarak kullanıp değerlerle ilişkilendirmenin nasıl yapıldığını gösterir.
1// Use objects as keys in a Map
2const keyObj = { id: 1 };
3const keyFunc = () => {};
4const objMap = new Map();
5
6// Another object with the same content but a different reference
7const anotherKeyObj = { id: 1 };
8
9objMap.set(keyObj, 'objectValue');
10objMap.set(keyFunc, 'functionValue');
11objMap.set(anotherKeyObj, 'anotherValue');
12
13console.log(objMap.get(keyObj)); // 'objectValue'
14console.log(objMap.get(keyFunc)); // 'functionValue'
15console.log(objMap.get(anotherKeyObj)); // 'anotherValue'
- Nesneleri anahtar olarak kullanırken, aynı referans olmaları önemlidir. İçerikleri aynı olsa bile, referansları farklı olan nesneler farklı kabul edilir ve aynı anahtar değildir.
Yinelenme (döngü)
Map, ekleme sırasını koruduğu için, gezinti sıklıkla kullanılır.
Aşağıda, for...of, forEach ve keys(), values(), entries() yöntemlerinin nasıl kullanılacağını gösteriyoruz.
1// Iterating a Map with for...of and forEach
2const iterMap = new Map([['a', 1], ['b', 2], ['c', 3]]);
3
4// for...of over entries (default)
5for (const [key, value] of iterMap) {
6 console.log(key, value);
7}
8
9// forEach callback
10iterMap.forEach((value, key) => {
11 console.log(key, value);
12});
13
14// keys() and values()
15console.log([...iterMap.keys()]); // ['a','b','c']
16console.log([...iterMap.values()]); // [1,2,3]
entries(),[anahtar, değer]çiftlerinden oluşan bir dizi döndürür; bu, yayılma (spread) sözdizimi ile diziye dönüştürülebilir.forEachfonksiyonunun geri çağırma fonksiyonunun argümanlarıdeğer, anahtarsırası ile aldığını unutmayın.
Map ve Object Dönüşümleri
Mevcut bir nesneyi Map'e, ya da Map'i düz bir nesneye veya diziye dönüştürebilirsiniz.
1// Convert between Map and Object / Array
2const obj = { a: 1, b: 2 };
3const mapFromObj = new Map(Object.entries(obj)); // Object -> Map
4console.log(mapFromObj.get('a')); // 1
5
6const objFromMap = Object.fromEntries(mapFromObj); // Map -> Object
7console.log(objFromMap); // { a: 1, b: 2 }
8
9const arrayFromMap = [...mapFromObj]; // Map -> Array of [key, value]
10console.log(arrayFromMap); // [['a',1], ['b',2]]
Object.entriesveObject.fromEntrieskullanarak dönüşüm kolaylaşır. Ancak, nesne anahtarları sadece string veya sembol olabileceğinden, tekrar nesneye dönüştürdüğünüzde string olmayan anahtarlar kaybolur.
Pratik Desen: Frekans Sayımı (Sayıcı Map)
Bir dizideki elemanların sıklığını sayarken, Map kullanmak işlemi daha basit hale getirir.
Aşağıdaki kod, bir dizideki stringlerin sıklığını saymak ve onları sıralamak için bir Map kullanmanın örneğidir.
1// Count frequencies with Map
2const arr = ['apple','banana','apple','orange','banana','apple'];
3const freq = new Map();
4
5for (const item of arr) {
6 freq.set(item, (freq.get(item) || 0) + 1);
7}
8
9console.log([...freq.entries()]); // [['apple',3], ['banana',2], ['orange',1]]
Mapkullanmak, varlık kontrolünü ve güncellemeleri kolaylaştırır. Bu, nesnelerle de yapılabilir, ancakMaprastgele anahtarlarla çalışırken daha sezgisel olabilir.
Map ve JSON.stringify Hakkında Notlar (Serileştirme)
JSON.stringify, bir Map nesnesini doğrudan serileştiremez. Bir Map'i kaydetmeniz gerekiyorsa, önce dönüştürmelisiniz.
Aşağıdaki örnek, bir Map'in önce diziye, sonra JSON'a dönüştürülmesini ve ardından geri yüklenmesini gösterir.
1// Serialize and deserialize a Map
2const m3 = new Map([['x', 1], ['y', 2]]);
3const json = JSON.stringify([...m3]); // convert to array first
4console.log(json); // '[["x",1],["y",2]]'
5
6const restored = new Map(JSON.parse(json));
7console.log(restored.get('x')); // 1
- Kaydedilecek ya da iletilecek Map'ler, serileştirmeden önce diziye dönüştürülmelidir. Geri yüklerken, önce
JSON.parseile diziye dönüştürmeli, sonra tekrar Map'e çevirmelisiniz.
WeakMap'e Giriş ve Nasıl Kullanılır
WeakMap, anahtarlarının zayıf referanslanması (çöp toplamaya tabi olması) ile farklılık gösterir.
Nesneleri anahtar olarak kullanıp, önbellek ya da metaveri tutmak için uygundur; anahtar nesne toplandığında otomatik olarak serbest bırakılır.
1// WeakMap for metadata tied to object lifecycle
2const wm = new WeakMap();
3let obj = {};
4wm.set(obj, { meta: 'info' });
5console.log(wm.get(obj)); // { meta: 'info' }
6
7obj = null; // now the object can be GC'd and its entry removed from WeakMap
WeakMap, gezinemediği ve boyutu ölçülemediği halde, bellek sızıntılarını önlemek için kullanışlıdır.
Özet
Map, nesnelerden farklı olarak her türden anahtarı kabul eden ve ekleme sırasını koruyan kullanışlı bir koleksiyondur. Temel işlemlerden ileri kullanıma kadar her şeyi anlayarak, verileri daha esnek ve sezgisel şekilde yönetebilirsiniz. Kullanım durumuna göre Object ve Map'i uygun şekilde kullanarak, kodun açıklığını ve okunabilirliğini büyük ölçüde artırabilirsiniz.
Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.