`Set` nesnesi
Bu makale Set nesnesini açıklar.
Set nesnesini pratik örneklerle açıklayacağız.
YouTube Video
Set nesnesi
Set, benzersiz, tekrarlanmayan değerler koleksiyonlarını yönetmek için kullanılan yerleşik bir nesnedir. Diziye kıyasla tekrarları ortadan kaldırma ve varlık kontrolünü daha basit bir şekilde yazmanıza olanak tanır, ayrıca birleşim ve kesişim gibi küme işlemlerini uygulamayı kolaylaştırır.
Temel Bilgiler: Set'ler Oluşturmak ve Kullanmak
Öncelikle bir Set nasıl oluşturulur, eleman nasıl eklenir ve kaldırılır, varlık kontrolü nasıl yapılır ve boyutu nasıl alınır bunlara bakalım.
Aşağıda yeni bir Set oluşturup add, has, delete ve size yöntemlerini gösteren temel bir örnek bulunmaktadır.
1// Create a Set and demonstrate add, has, delete, and size
2const s = new Set();
3
4s.add(1);
5s.add(2);
6s.add(2); // duplicate, ignored
7
8console.log(s.has(1)); // true
9console.log(s.has(3)); // false
10
11s.delete(2);
12console.log(s.size); // 1
13
14console.log([...s]); // [1]
- Bu kodda gösterildiği gibi,
Setotomatik olarak yinelenen ilkel değerleri kaldırır vesizekullanarak eleman sayısını alabilirsiniz.
Yinelenme yöntemleri
Set yineleyebilirdir, bu nedenle for...of veya forEach kullanarak üzerinde döngü kurabilirsiniz. Sıra, ekleme sırasına göredir.
for...of ve forEach kullanımının tipik yolları aşağıdadır.
1// Iterate a Set with for...of and forEach
2const s = new Set(['a', 'b', 'c']);
3
4for (const v of s) {
5 console.log('for...of:', v);
6}
7
8s.forEach((value, sameValue, setRef) => {
9 // Note: second arg is same as first for Set API to match Map signature
10 console.log('forEach:', value);
11});forEachiçin geri çağırım imzasıvalue, value, setşeklindedir (Map ile uyumluluk için), ancak pratikte genellikle sadece ilkvalueargümanına ihtiyaç duyarsınız.
Diziler ve Set'ler Arası Dönüştürme (tekrarları kaldırmak için faydalı)
Burada bir diziden tekrarları kaldırmanın basit bir yöntemini ve bir Seti tekrar diziye dönüştürmeyi gösteriyoruz.
Aşağıda bir diziyi Set'ten geçirerek tekrarların nasıl kaldırılacağına dair bir örnek bulunmaktadır.
1// Deduplicate an array using Set
2const arr = [1, 2, 2, 3, 3, 3];
3const deduped = [...new Set(arr)];
4console.log(deduped); // [1, 2, 3]
5
6// Convert a Set to an array using Array.from
7const s = new Set([4, 5, 6]);
8const arrFromSet = Array.from(s);
9console.log(arrFromSet); // [4, 5, 6]
- Bu yöntem kısa ve hızlıdır, bu yüzden dizi tekrarlarını kaldırmak için sıkça kullanılır. Özellikle ilkel değerler için etkilidir.
Nesne ve Referans Yönetimi
Set içinde nesneler referansla karşılaştırılır, bu nedenle aynı içeriğe sahip farklı örnekler ayrı elemanlar olarak görülür.
Aşağıdaki kod, nesneler Set'e eklendiğinde ne olacağını göstermektedir.
1// Objects are compared by reference in a Set
2const obj1 = { x: 1 };
3const obj2 = { x: 1 };
4
5const s = new Set();
6s.add(obj1);
7s.add(obj2);
8
9console.log(s.size); // 2 (different references)
10console.log(s.has(obj1)); // true
11console.log(s.has({ x: 1 })); // false (different object)
- Nesneler için tekrar tespiti referans kimliğine dayanır, bu nedenle sadece nesne içeriğine göre tekrarları kaldırmak istiyorsanız, bunları serileştirmeniz veya başka şekilde işlemeniz gerekir.
Özel Değerler: NaN ve -0/+0 işlenmesi
Set, değer eşitliğini belirlemek için Aynı-değer-sıfır karşılaştırma kuralını kullanır. Bu karşılaştırma yöntemi sayılarla ilgili olarak aşağıdaki özelliklere sahiptir:.
NaN,NaNile eşit kabul edilir.- Pozitif
+0ve negatif-0ayırt edilmez ve aynı değer olarak kabul edilir.
Bu nedenle, bu değerleri bir Set'e eklediğinizde şu davranış ortaya çıkar:.
1// NaN and zero behavior in Set
2const s = new Set();
3
4s.add(NaN);
5s.add(NaN);
6console.log(s.size); // 1 (NaN considered the same)
7
8s.add(+0);
9s.add(-0);
10console.log(s.size); // still 2 (NaN + 0)
11console.log([...s]); // [NaN, 0] (order may vary but only one zero)
- Normal karşılaştırmada (
NaN === NaN)falsedöner, ancak birSetiçinde tümNaNdeğerleri 'aynı değer' olarak kabul edilir. - +0 ve -0 matematiksel olarak ayırt edilebilir, ancak bir
Setiçinde basitçe0olarak kabul edilirler. - Sonuç olarak,
Setiçinde yalnızca birNaNve bir0kalır. Set'in karşılaştırma kuralıObject.is'e benzer, fakat tam olarak aynı değildir.Object.is(+0, -0)falsedöndürür, ancak birSetiçinde bunlar aynı kabul edilir. Lütfen bu farka dikkat edin.
Yaygın Kullanımlar: Küme İşlemleri (Birleşim, Kesişim, Fark)
Küme işlemleri, Set kullanılarak daha açık bir şekilde yazılabilir. Aşağıda yaygın uygulama örnekleri yer almaktadır.
Birleşim, kesişim ve fark için fonksiyon örnekleri aşağıdadır.
1// Set operations: union, intersection, difference
2function union(a, b) {
3 return new Set([...a, ...b]);
4}
5
6function intersection(a, b) {
7 return new Set([...a].filter(x => b.has(x)));
8}
9
10function difference(a, b) {
11 return new Set([...a].filter(x => !b.has(x)));
12}
13
14// Demo
15const A = new Set([1, 2, 3]);
16const B = new Set([3, 4, 5]);
17
18console.log('union', [...union(A, B)]); // [1,2,3,4,5]
19console.log('intersection', [...intersection(A, B)]); // [3]
20console.log('difference A\\B', [...difference(A, B)]); // [1,2]
Setve dizileri birlikte kullanarak filtrelerle küme işlemleri basitçe yazılabilir. Büyük veri kümeleriyle çalışırken,has'in O(1) performansı işlemleri hızlandırır.
Pratik Örnek: Dizi Farklarını Bulmak (Eklenen/Kaldırılan Öğeleri Tespit Etmek)
Aşağıdaki örnek, iki dizi (eski liste ve yeni liste) arasındaki farkı bulmak için bir Set'in nasıl kullanılacağını göstermektedir. Bu, hangi elemanların eklendiğini ve hangilerinin kaldırıldığını belirlemenizi sağlar.
1// Find added and removed items between two arrays
2function diffArrays(oldArr, newArr) {
3 const oldSet = new Set(oldArr);
4 const newSet = new Set(newArr);
5
6 const added = [...newSet].filter(x => !oldSet.has(x));
7 const removed = [...oldSet].filter(x => !newSet.has(x));
8
9 return { added, removed };
10}
11
12const oldList = [1, 2, 3];
13const newList = [2, 3, 4, 5];
14
15console.log(diffArrays(oldList, newList));
16// { added: [4,5], removed: [1] }
- Bu yöntem, ID listeleri, etiket listeleri ve benzeri durumlarda farkları tespit etmek için oldukça kullanışlıdır. İlkel değerlerle kullanımı en basittir.
WeakSet ve Set Arasındaki Farklar (Bellek Yönetimi)
WeakSet, Set'e benzerdir ancak zayıf referanslar kullanır; bu sayede içindeki ögeler çöp toplayıcı tarafından kaldırılabilir. Aşağıda WeakSet'in temel kullanımları gösterilmektedir.
1// WeakSet basics (objects only, not iterable)
2const ws = new WeakSet();
3let obj = { id: 1 };
4ws.add(obj);
5
6console.log(ws.has(obj)); // true
7
8obj = null; // Now the object is eligible for GC; WeakSet won't prevent collection
WeakSet yalnızca nesneleri tutabilir ve üzerinden yinelenemez. Aşağıda WeakSet'in sınırlamalarına örnekler verilmektedir—yalnızca nesneleri tutabilir ve üzerinde yineleme yapılamaz.
1// WeakSet basics (objects only, not iterable)
2const ws = new WeakSet();
3
4// --- Only objects can be added ---
5try {
6 ws.add(1); // number
7} catch (e) {
8 console.log("Error: WeakSet can only store objects. Adding a number is not allowed.");
9}
10
11try {
12 ws.add("text"); // string
13} catch (e) {
14 console.log("Error: WeakSet can only store objects. Adding a string is not allowed.");
15}
16
17// --- WeakSet is not iterable ---
18try {
19 for (const value of ws) {
20 console.log(value);
21 }
22} catch (e) {
23 console.log("Error: WeakSet is not iterable. You cannot use for...of to loop over its elements.");
24}
25
26// --- Cannot convert to array ---
27try {
28 console.log([...ws]);
29} catch (e) {
30 console.log("Error: WeakSet cannot be converted to an array because it does not support iteration.");
31}
32
33// The object becomes eligible for garbage collection
34let obj = { id: 1 };
35ws.add(obj);
36obj = null;WeakSet, nesnelerin varlığını geçici olarak izlemek için faydalıdır, ancak elemanlarını listeleyemez veya boyutunu öğrenemezsiniz.
Performans ve Ne Zaman Kullanılacağına Karar Verme
Set kullanmaya karar verirken, performans özelliklerini ve veri yapınızı anlamak önemlidir.
has,addvedeletegenellikle ortalama olarak neredeyse O(1) performansında çalışır. Bu nedenle, sık sık varlık kontrolü veya tekrar kaldırmanın gerektiği durumlardaSetçoğunlukla dizilerden daha avantajlıdır.- Nesneleri içeriğine (değerlerine) göre tekrar kaldırmak istiyorsanız dikkatli olun.
Setreferansla karşılaştırma yaptığı için, içerik tabanlı karşılaştırmaya ihtiyaç duyduğunuzda ID veya başka anahtarlar kullanmak veya nesneleri ilkel değerlere serileştirmek pratik bir yoldur. Set, küçük ve orta büyüklükteki koleksiyonlar için kodun okunabilirliğini artırmada özellikle faydalıdır. Öte yandan, çok fazla sayıda elemanla çalışıyor veya diziler ve Set'ler arasında sık sık dönüşüm yapıyorsanız, gerçekten benchmark yapıp test etmeniz önerilir.
Yaygın Hatalar
Set kullanışlıdır fakat özelliklerinin farkında değilseniz, beklenmeyen davranışlar karşısında şaşırabilirsiniz. Dikkat etmeniz gereken bazı tipik noktalar şunlardır:.
- Nesneler referansla karşılaştırılır, bu yüzden içeriği aynı olsa bile farklı nesneler tekrar sayılmaz.
Set, ekleme sırasını korur, ancak dizilerdeki gibi elemanlara indeksle erişemezsiniz. İndeks tabanlı erişim kullanmak istiyorsanız, önceSeti bir diziye dönüştürün.WeakSetlisteleme yapılamaz ve sadece nesne saklayabilir. Kullanım alanlarının sınırlı olduğunu unutmayın.NaNaynı değer olarak kabul edilir ve+0ile-0ayırt edilmez. Bu, Aynı-değer-sıfır karşılaştırma kuralından kaynaklanır.
Özet
Set, benzersiz değerler koleksiyonlarını sezgisel olarak yönetmenize olanak tanıyan kullanışlı bir veri yapısıdır. Dizilerden tekrarları kaldırmak, hızlı varlık kontrolü yapmak veya birleşim ve kesişim gibi küme işlemlerini basit ve okunabilir bir kodla uygulamak için kullanabilirsiniz.
Öte yandan, nesneler referansla karşılaştırıldığı için içeriklerine göre eşitliği değerlendirmek istiyorsanız ek önlemler gerekir.
Bu özellikleri anlayıp uygun şekilde kullanarak Set, kodun okunabilirliğini ve sürdürülebilirliğini artırmak için güçlü bir seçenek haline gelir.
Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.