Veri yapılarından biraz uzaklaÅıp bunların döngülerinden bahsedecek olursak;
Bir önceki bölümde map.keys(), map.values(), map.entries() gibi metodlar vardı.
Bu metodlar generic metodlardır. Bunların veri yapılarında kullanılması çoÄu dilde ortaktır. EÄer yeni bir veri yapısı yapmak istiyorsanız siz de bunların uygulamasını yapmalısınız.
Bunlar:
MapSetArray(arr.values()hariç)
⦠için desteklenir.
Basit objeler de aynı metodları destekler aslında, fakat yazımları biraz daha fazladır.
Object.keys, values, entries
Basit objeler için aÅaÄıdaki metodlar kullanılabilir.
- Object.keys(obj) â anahtarları dizi Åeklinde döndürür.
- Object.values(obj) â deÄerleri dizi Åeklinde döndürür.
- Object.entries(obj) â
[anahtar, deÄer]çiftini dizi Åeklinde döndürür.
⦠Farklılıklarına dikkat edin. (aÅaÄıda map örneÄi gösterilmiÅtir):
İlk farklılık obj.keys() deÄil de Object.keys(obj) dönmeniz gerekmektedir.
Peki neden? Ana neden esnekliktir. Hatırlarsanız, objeler tüm karmaÅık yapıların temelidir. Bundan dolayı kendimize ait order gibi bir objeniz ve bunun kendine ait bir order.values() metodu olabilir. Yine de bunun üzerinde Object.values(order)'ı çaÄırabilmeniz gerekir.
DiÄer bir farklılık ise Object.* metodları âgerçekâ dizi döner. Sadece sıralı döngü objesi deÄil. Bu da tarihsel nedenlerden dolayıdır aslında.
ÃrneÄin:
let kullanici = {
adi: "Ahmet",
yasi: 30
};
Object.keys(kullanici) = [adi, yasi]Object.values(kullanici) = ["Ahmet", 30]Object.entries(kullanici) = [ ["adi","Ahmet"], ["yasi",30] ]
Burada ise Object.valuesâun özelliklerinin döngüde kullanımı gösterilmektedir:
let kullanici = {
adi: "Ahmet",
yasi: 30
};
// deÄerler üzerinden döngü
for(let deger of Object.values(kullanici)) {
alert(deger); // Ahmet,sonrasında 30
}
for..in döngüsünde olduÄu gibi, bu metodlar Symbol(...)'ü anahtar olarak kullanan özellikleri pas geçerler.
Bu baya iÅe yarar bir özelliktir. Fakat symbol özelliklerini almak istiyorsanız Object.getOwnPropertySymbols metodunu kullanabilirsiniz. Ayrıca Reflect.ownKeys(obj) tüm anahtarları döner.
Nesneleri dönüÅtürmek için Object.fromEntries
Bazen bir nesneyi Mape dönüÅtürüp ardından onu objeye geri dönüÅtürmemiz gerekir.
Halihazırda objden Map yapmak için new Map(Object.entries(obj)) var.
Object.fromEntries in sözdizimi(syntaxi) tam tersini yapar. [key, value] çifti dizisi verildiÄinde, bir obje oluÅturur:
let fiyatlar = Object.fromEntries([
['muz', 1],
['portakal', 2],
['et', 4]
]);
// Åimdi fiyatlar = { muz: 1, portakal: 2, et: 4 }
alert(fiyatlar.portakal); // 2
Pratik uygulamaları görelim.
ÃrneÄin, mevcut olandan iki kat fiyatla yeni bir nesne oluÅturmak istiyoruz.
Diziler için, bir diziyi dönüÅtürmeye izin veren .map metodumuz var, ancak nesneler için böyle bir Åey yok.
Bu yüzden bir döngü kullanabiliriz:
let fiyatlar = {
muz: 1,
portakal: 2,
et: 4,
};
let ikiKatiFiyatlar = {};
for(let [product, price] of Object.entries(fiyatlar)) {
ikiKatiFiyatlar[product] = price * 2;
}
alert(ikiKatiFiyatlar.et); // 8
â¦Veya Object.entries kullanarak nesneyi bir Array olarak temsil edebilir, daha sonra iÅlemleri map (ve muhtemelen diÄer dizi metodları) ile gerçekleÅtirebilir ve daha sonra Object.fromEntries kullanarak geri dönebiliriz.
Bunu bizim objemiz için yapalım:
let fiyatlar = {
muz: 1,
portakal: 2,
et: 4,
};
let ikiKatiFiyatlar = Object.fromEntries(
// diziye dönüÅtürür, Map ve sonra fromEntries nesneyi geri döndürür
Object.entries(fiyatlar).map(([key, value]) => [key, value * 2])
);
alert(ikiKatiFiyatlar.et); // 8
İlk görüÅte zor görünebilir, ancak bir veya iki kez kullandıktan sonra anlaÅılması kolaylaÅır.
Mapten bir obje almak içinfromEntries de kullanabiliriz.
ÃrneÄin. Bir fiyat Mapimiz var, ancak bunu bir nesne bekleyen 3. taraf koduna geçirmemiz gerekiyor.
Åu Åekilde:
let map = new Map();
map.set('muz', 1);
map.set('portakal', 2);
map.set('et', 4);
let obj = Object.fromEntries(map);
// now obj = { muz: 1, portakal: 2, et: 4 }
alert(obj.portakal); // 2

Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)