Salvo

WFN Üye
Konular
1,743
Mesajlar
1,765
Çözüm
0
Ticaret Puanı
0
Üyelik
6 Ay 16 Gün
Konum
İstanbul
Web Sitesi
Yok
Alanı
Belirtmemiş
1/1
Konu sahibi
İlk olarak dizinin eleman türüne uygun bir karşılaştırma işlevi verin. Sayıları sıralarken 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ırmaOrijinal dizi
Küçükten büyüğe sayı(a, b) => a - bKopya kullanılırsa korunur
Büyükten küçüğe sayı(a, b) => b - aKopya 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şlevKopya kullanılırsa korunur
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.

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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic