- Konu sahibi
- #1
İlk olarak dizinin eleman türüne uygun bir karşılaştırma işlevi verin. Sayıları sıralarken
JavaScript ve TypeScript’te
Burada
Metinleri alfabetik sıralamak için doğrudan
Nesne dizilerinde ise sıralanacak özelliği karşılaştırma işlevinde açıkça belirtin:
Bu örnekte
Sık kullanılan sıralama biçimleri arasındaki fark şöyledir:
Bu seçim, beklenen sonucu doğrudan etkiler: sayı dizisinde metin karşılaştırması kullanırsanız sıralama sözlük düzenine göre yapılır; nesne dizisinde yanlış özelliği karşılaştırırsanız TypeScript bunu her zaman mantıksal bir hata olarak yakalayamaz.
Bu davranış istenmiyorsa sıralamadan önce kopya oluşturun:
Buradaki
Bir nesne dizisinde sıralama sonrasında nesne özelliklerine erişebiliyorsanız tür korunmuştur:
Son satırda TypeScript,
Kısa kural şudur: Sayılar için sayısal karşılaştırma işlevi kullanın, metinlerde
a - b, metinleri sıralarken localeCompare() kullanın. TypeScript, sort() sonucunu dizinin eleman türünü koruyarak döndürür; ancak sort() mevcut diziyi değiştirir. Orijinal diziyi korumanız gerekiyorsa önce kopyasını alıp sıralayın: [...dizi].sort(...).Sayı dizisini doğru sıralama
JavaScript ve TypeScript’te
sort() karşılaştırma işlevi verilmeden kullanılırsa elemanları metin gibi karşılaştırır. Bu nedenle [10, 2, 30].sort() ifadesi sayısal olarak beklenen [2, 10, 30] sonucunu vermez. Sayısal sıralama için iki elemanı karşılaştıran ve farklarını döndüren bir işlev kullanın:
Kod:
const sayilar: number[] = [10, 2, 30, 4];
const siraliSayilar = [...sayilar].sort((a, b) => a - b);
console.log(siraliSayilar);
// [2, 4, 10, 30]
Burada
a - b negatifse a önce, pozitifse b önce gelir. b - a kullanılırsa sıralama büyükten küçüğe yapılır:
Kod:
const buyuktenKucuge = [...sayilar].sort((a, b) => b - a);
console.log(buyuktenKucuge);
// [30, 10, 4, 2]
siraliSayilar ve buyuktenKucuge değişkenlerinin türü number[] olarak korunur. Bunun nedeni, sort() yönteminin çağrıldığı dizinin eleman türüyle çalışmasıdır.Türü korunan metin ve nesne dizileri
Metinleri alfabetik sıralamak için doğrudan
a - b kullanılamaz. Karşılaştırma sonucunu üretmek için localeCompare() kullanabilirsiniz:
Kod:
const diller: string[] = ["TypeScript", "JavaScript", "Python"];
const alfabetikDiller = [...diller].sort((a, b) =>
a.localeCompare(b, "tr")
);
console.log(alfabetikDiller);
// ["JavaScript", "Python", "TypeScript"]
Nesne dizilerinde ise sıralanacak özelliği karşılaştırma işlevinde açıkça belirtin:
Kod:
type Kullanici = {
ad: string;
yas: number;
};
const kullanicilar: Kullanici[] = [
{ ad: "Zeynep", yas: 28 },
{ ad: "Ali", yas: 22 },
{ ad: "Mert", yas: 35 }
];
const yasaGore = [...kullanicilar].sort((a, b) => a.yas - b.yas);
console.log(yasaGore);
// [
// { ad: "Ali", yas: 22 },
// { ad: "Zeynep", yas: 28 },
// { ad: "Mert", yas: 35 }
// ]
Bu örnekte
yasaGore değişkeninin türü Kullanici[] olur. Sıralama yalnızca nesnelerin dizideki konumunu değiştirir; nesnelerin ad ve yas özelliklerini kaldırmaz veya başka bir türe dönüştürmez.Sık kullanılan sıralama biçimleri arasındaki fark şöyledir:
| Amaç | Karşılaştırma | Orijinal dizi |
|---|---|---|
| Küçükten büyüğe sayı | (a, b) => a - b | Kopya kullanılırsa korunur |
| Büyükten küçüğe sayı | (a, b) => b - a | Kopya kullanılırsa korunur |
| Alfabetik metin | (a, b) => a.localeCompare(b, "tr") | Kopya kullanılırsa korunur |
| Nesne özelliğine göre | İlgili özelliği karşılaştıran işlev | Kopya kullanılırsa korunur |
Dizinin değişmesini istemiyorsanız
sort() diziyi yerinde değiştirir. Aşağıdaki kodda hem sayilar hem de sirali aynı dizi nesnesini gösterir:
Kod:
const sayilar = [3, 1, 2];
const sirali = sayilar.sort((a, b) => a - b);
console.log(sayilar); // [1, 2, 3]
console.log(sirali); // [1, 2, 3]
Bu davranış istenmiyorsa sıralamadan önce kopya oluşturun:
Kod:
const sayilar = [3, 1, 2];
const sirali = [...sayilar].sort((a, b) => a - b);
console.log(sayilar); // [3, 1, 2]
console.log(sirali); // [1, 2, 3]
readonly bir dizi kullanıyorsanız doğrudan sort() çağırmak yerine kopya almak gerekir; çünkü readonly dizi yerinde değiştirilemez:
Kod:
const sayilar: readonly number[] = [3, 1, 2];
const sirali: number[] = [...sayilar].sort((a, b) => a - b);
Buradaki
sirali yeni ve değiştirilebilir bir number[] dizisidir. Sıralama sonucunun da salt okunur kalmasını istiyorsanız türünü ayrıca belirtebilirsiniz:
Kod:
const sirali: readonly number[] = [...sayilar].sort((a, b) => a - b);
Türün gerçekten korunup korunmadığını nasıl kontrol edersiniz?
Bir nesne dizisinde sıralama sonrasında nesne özelliklerine erişebiliyorsanız tür korunmuştur:
Kod:
type Urun = {
ad: string;
fiyat: number;
};
const urunler: Urun[] = [
{ ad: "Klavye", fiyat: 900 },
{ ad: "Fare", fiyat: 500 }
];
const fiyataGore = [...urunler].sort((a, b) => a.fiyat - b.fiyat);
const ilkUrunAdi: string = fiyataGore[0].ad;
Son satırda TypeScript,
fiyataGore[0] değerini Urun olarak bildiği için ad özelliğine erişime izin verir. Sıralama yalnızca sırayı değiştirir; tür güvenliği, değerlerin çalışma zamanında gerçekten beklenen biçimde olduğunu doğrulamaz. Örneğin dışarıdan gelen JSON verisi, TypeScript türüyle işaretlenmiş olsa bile ayrıca doğrulanmadıkça otomatik olarak güvenilir hâle gelmez.Kısa kural şudur: Sayılar için sayısal karşılaştırma işlevi kullanın, metinlerde
localeCompare() tercih edin, nesnelerde karşılaştırılacak özelliği belirtin ve orijinal diziyi korumak için sıralamadan önce kopya alın.