JavaScript’in sort() Metodu ile String Dizilerini Sıralama: Derinlemesine Bir Kılavuz
JavaScript, web geliştirmenin temel taşlarından biri olarak, veri manipülasyonu için güçlü ve esnek araçlar sunar. Bu araçlardan biri de dizileri sıralamak için kullanılan Array.prototype.sort() metodudur. Özellikle string (metin) dizileriyle çalışırken, bu metodun nasıl davrandığını, varsayılan sıralama kurallarını ve ihtiyaçlarınıza göre nasıl özelleştirebileceğinizi anlamak kritik öneme sahiptir. Bu makale, JavaScript’in sort() metodunu kullanarak string dizilerini sıralamanın inceliklerini, varsayılan davranışlardan yerel duyarlı sıralamaya kadar tüm detaylarıyla ele alacaktır.
Giriş: Neden String Sıralaması Önemli?
Veri görüntüleme, arama işlevleri, filtreleme ve genel kullanıcı deneyimi açısından sıralama, çoğu uygulamanın vazgeçilmez bir parçasıdır. Bir ürün listesini alfabetik olarak sıralamak, bir kullanıcı adları listesini düzenlemek veya bir şehir listesini coğrafi olarak anlamlı bir sıraya koymak gibi pek çok senaryoda string sıralamasına ihtiyaç duyarız. JavaScript’in sort() metodu, bu tür görevler için yerleşik bir çözüm sunar. Ancak, metin verilerinin karmaşıklığı (büyük/küçük harf duyarlılığı, farklı dillerdeki karakter setleri, özel semboller) nedeniyle, bu metodun doğru ve etkili bir şekilde kullanılması özel dikkat gerektirir.
Temel Kavramlar: Diziler, Stringler ve Unicode
sort() metodunu anlamadan önce, üzerinde çalıştığı temel veri yapılarını ve metin gösterimini kısaca hatırlamak faydalı olacaktır.
Diziler (Arrays)
JavaScript’te diziler, sıralı bir şekilde öğeleri depolayan listelerdir. Her öğe bir indeks ile erişilebilir ve dizi dinamik olarak büyüyüp küçülebilir. sort() metodu, bu dizilerin öğelerini belirli bir kritere göre yeniden düzenler.
Stringler (Strings)
Stringler, metin verilerini temsil eden karakter dizileridir. JavaScript’te stringler değişmez (immutable) yapıdadır, yani bir string oluşturulduktan sonra içeriği değiştirilemez. Sıralama işlemleri, genellikle stringlerin yeni sıralanmış bir görünümünü oluşturmayı veya orijinal diziyi yerinde değiştirmeyi içerir.
Unicode
Modern bilgi işlemde metinler, Unicode standardı kullanılarak temsil edilir. Unicode, dünya üzerindeki hemen hemen her yazı sistemindeki karakterleri kodlamak için geniş bir karakter seti sağlar. JavaScript stringleri de Unicode karakterlerden oluşur. sort() metodunun varsayılan davranışı, stringleri karşılaştırırken bu Unicode değerlerine dayanır. Bu, özellikle farklı dillerden karakterler içeren stringlerle çalışırken önemli sonuçlar doğurabilir.
sort() Metoduna Giriş
Array.prototype.sort() metodu, bir dizinin öğelerini yerinde (in-place) sıralar ve sıralanmış diziyi döndürür. Varsayılan sıralama düzeni artan (ascending) düzendir.
Sözdizimi
arr.sort([compareFunction])
* arr: Sıralanacak dizi.
* compareFunction (isteğe bağlı): Sıralama düzenini tanımlayan bir fonksiyon. Belirtilmezse, dizi öğeleri stringlere dönüştürülür ve Unicode kod noktası değerlerine göre sıralanır.
sort() Metodunun Davranışı
1. Yerinde Sıralama (In-place Sorting): sort() metodu, orijinal diziyi doğrudan değiştirir. Bu, özellikle büyük dizilerle çalışırken bellek verimliliği açısından faydalıdır, ancak orijinal dizinin bozulmamasını istiyorsanız, sıralamadan önce bir kopyasını oluşturmanız gerektiğini unutmayın (arr.slice().sort()).
2. Dönüş Değeri: Sıralanmış dizinin kendisini döndürür. Bu, zincirleme metot çağrılarına olanak tanır.
3. Varsayılan Sıralama Davranışı:
* compareFunction sağlanmadığında, sort() metodu dizi öğelerini geçici olarak stringlere dönüştürür (gerekirse).
* Daha sonra, bu stringleri Unicode kod noktası değerlerine göre karşılaştırır. Bu, “alfabetik” sıralama gibi görünse de, büyük ve küçük harflerin farklı Unicode değerleri olduğu için beklendiği gibi çalışmayabilir. Örneğin, 'Z' karakterinin Unicode değeri 'a' karakterinden daha küçüktür. Bu nedenle, varsayılan sıralamada büyük harfler genellikle küçük harflerden önce gelir.
Örnek:
const fruits = ['Banana', 'apple', 'Orange', 'grape'];
fruits.sort();
console.log(fruits); // Çıktı: ["Banana", "Orange", "apple", "grape"]
Yukarıdaki örnekte, 'B' (Banana) ve 'O' (Orange) karakterlerinin Unicode değerleri 'a' (apple) ve 'g' (grape) karakterlerinden daha küçüktür. Bu yüzden büyük harfle başlayan stringler önce gelir. Bu durum, çoğu zaman istediğimiz “alfabetik” sıralama değildir.
String Dizilerini Varsayılan Olarak Sıralama (Büyük/Küçük Harf Duyarlı)
Varsayılan sort() metodu, stringler için büyük/küçük harf duyarlı bir sıralama yapar. Bu, bazı durumlarda kullanışlı olabilirken, çoğu zaman kullanıcıların beklediği “sözlük sırası” değildir.
const cities = ['Istanbul', 'ankara', 'Izmir', 'bursa'];
cities.sort();
console.log(cities); // Çıktı: ["Istanbul", "Izmir", "ankara", "bursa"]
Burada 'I' ve 'İ' (Istanbul, Izmir) karakterlerinin Unicode değerleri 'a' ve 'b' (ankara, bursa) karakterlerinden daha düşüktür. Bu nedenle büyük harfle başlayan şehirler önce sıralanır. Türkçe karakterler (ç, ğ, ı, ö, ş, ü) de bu Unicode sıralamasında özel bir yere sahiptir ve standart İngilizce karakterlerden farklı davranabilir. Örneğin, ‘ç’ karakterinin Unicode değeri ‘c’ karakterinden farklıdır ve varsayılan sıralamada beklenmedik sonuçlar doğurabilir.
Özel Sıralama Fonksiyonu (compareFunction) Kullanımı
JavaScript’in sort() metodunun gerçek gücü, isteğe bağlı compareFunction parametresinde yatar. Bu fonksiyon, sıralamanın nasıl yapılacağını tam olarak kontrol etmenizi sağlar.
Neden Bir compareFunction‘a İhtiyaç Duyarız?
* Büyük/Küçük Harf Duyarsız Sıralama: Varsayılan davranışın aksine, büyük ve küçük harfleri aynı kabul ederek sıralama yapmak için.
* Yerel Duyarlı Sıralama: Farklı dillerdeki (Türkçe, Almanca vb.) özel karakterlerin kendi dilbilgisel kurallarına göre sıralanması için.
* Sayısal Sıralama: Sayısal değerleri içeren stringleri doğru bir şekilde sayısal olarak sıralamak için (örneğin, “10” “2”den sonra gelmeli).
* Karmaşık Kriterler: Birden fazla özelliğe göre sıralama yapmak veya özel iş mantığı uygulamak için.
compareFunction(a, b) Yapısı
compareFunction iki argüman alır: a ve b. Bu iki öğe karşılaştırılır ve fonksiyonun döndürdüğü değere göre sıralama kararı verilir:
* Negatif Sayı (< 0): Eğer a, b‘den önce gelmeli ise. (a < b)
* Pozitif Sayı (> 0): Eğer a, b‘den sonra gelmeli ise. (a > b)
* Sıfır (0): Eğer a ve b‘nin sıralama pozisyonu değişmemeli ise (yani eşit kabul edilirler).
Örnek (Sayısal Sıralama – Kısa Bir Hatırlatma):
String sıralamasına geçmeden önce, compareFunction‘ın sayısal sıralamada nasıl çalıştığını anlamak, temel prensibi kavramak için faydalıdır.
const numbers = [10, 2, 5, 1, 100];
// Varsayılan sıralama (string olarak):
numbers.sort();
console.log(numbers); // Çıktı: [1, 10, 100, 2, 5] - Yanlış!
// Sayısal sıralama için compareFunction:
numbers.sort((a, b) => a - b); // Artan sıra
console.log(numbers); // Çıktı: [1, 2, 5, 10, 100] - Doğru!
numbers.sort((a, b) => b - a); // Azalan sıra
console.log(numbers); // Çıktı: [100, 10, 5, 2, 1] - Doğru!
Bu örnek, compareFunction‘ın önemini açıkça göstermektedir. Stringler için de benzer mantıkla, ancak string karşılaştırma metotları kullanarak çalışacağız.
String Dizilerini Büyük/Küçük Harf Duyarsız Sıralama
En yaygın string sıralama ihtiyaçlarından biri, büyük/küçük harf farkını göz ardı ederek “alfabetik” sıralama yapmaktır. Bunun için compareFunction içinde stringleri karşılaştırmadan önce hepsini aynı duruma (toLowerCase() veya toUpperCase()) getirebiliriz.
const fruits = ['Banana', 'apple', 'Orange', 'grape'];
fruits.sort((a, b) => {
const nameA = a.toLowerCase(); // Karşılaştırma için küçük harfe çevir
const nameB = b.toLowerCase(); // Karşılaştırma için küçük harfe çev
if (nameA < nameB) {
return -1; // nameA, nameB'den önce gelmeli
}
if (nameA > nameB) {
return 1; // nameA, nameB'den sonra gelmeli
}
return 0; // İki isim de eşit
});
console.log(fruits); // Çıktı: ["apple", "Banana", "grape", "Orange"]
Bu yaklaşım, İngilizce karakter setindeki stringler için oldukça iyi çalışır. Ancak, farklı dillerdeki özel karakterler (örneğin Türkçe ‘ç’, ‘ğ’, ‘ı’, ‘ö’, ‘ş’, ‘ü’ veya Almanca ‘ä’, ‘ö’, ‘ü’) için hala yetersiz kalabilir. Çünkü toLowerCase() veya toUpperCase() metotları, karakterin Unicode değerini değiştirir, ancak sıralama mantığı hala basit Unicode karşılaştırmasına dayanır.
Yerel Duyarlı Sıralama (Locale-Aware Sorting) ve localeCompare()
Farklı dillerin kendine özgü sıralama kuralları vardır. Örneğin, İsveççe’de ‘ö’ karakteri ‘z’den sonra gelirken, Almanca’da ‘o’ ile aynı kabul edilerek sıralanabilir (veya ‘oe’ olarak). Türkçe’de ise ‘ç’ ‘c’den sonra, ‘ğ’ ‘g’den sonra, ‘ı’ ‘i’den sonra, ‘ö’ ‘o’dan sonra, ‘ş’ ‘s’den sonra ve ‘ü’ ‘u’dan sonra gelir. Standart toLowerCase() karşılaştırması bu nüansları göz ardı eder.
İşte tam da bu noktada String.prototype.localeCompare() metodu devreye girer. localeCompare() metodu, iki stringi, belirtilen yerel ayar (locale) kurallarına göre karşılaştırır. Bu, dilbilgisel olarak doğru sıralama yapmanın en güvenilir yoludur.
localeCompare() Sözdizimi
string.localeCompare(otherString, [locales], [options])
* string: Karşılaştırılacak ana string.
* otherString: string ile karşılaştırılacak diğer string.
* locales (isteğe bağlı): Bir veya daha fazla dil etiketi içeren bir string veya string dizisi (örneğin, 'tr-TR', 'en-US', ['fr', 'de']). Sıralama bu yerel ayarların kurallarına göre yapılır. Belirtilmezse, kullanıcının varsayılan yerel ayarı kullanılır.
* options (isteğe bağlı): Sıralama davranışını özelleştiren bir nesne.
localeCompare() metodu, compareFunction gibi bir sayı döndürür:
* Negatif sayı: string, otherString‘den önce gelmeli.
* Pozitif sayı: string, otherString‘den sonra gelmeli.
* Sıfır: İki string eşit kabul edilir.
Türkçe Karakterler ve localeCompare()‘ın Önemi
Türkçe, dilimize özgü karakterlere (ç, ğ, ı, ö, ş, ü) sahip olduğu için, standart Unicode sıralaması genellikle yanlış sonuçlar verir. localeCompare() metodunu 'tr' yerel ayarıyla kullanmak, bu sorunu çözer.
Örnek: Türkçe Yerel Duyarlı Sıralama
const turkishWords = ['çilek', 'armut', 'elma', 'şeftali', 'üzüm'];
// Varsayılan sıralama (yanlış):
turkishWords.sort();
console.log(turkishWords); // Çıktı: ["armut", "elma", "üzüm", "çilek", "şeftali"]
// 'üzüm' 'çilek'ten önce, 'şeftali' 'çilek'ten sonra geldi
// Türkçe yerel duyarlı sıralama:
turkishWords.sort((a, b) => a.localeCompare(b, 'tr'));
console.log(turkishWords); // Çıktı: ["armut", "çilek", "elma", "şeftali", "üzüm"]
// Doğru Türkçe alfabetik sıra!
Görüldüğü gibi, localeCompare() ile 'tr' yerel ayarını belirtmek, Türkçe karakterlerin doğru bir şekilde sıralanmasını sağlar.
options Parametresi ile Gelişmiş Kontrol
options nesnesi, localeCompare()‘ın davranışını daha da ince ayarlamanıza olanak tanır. En sık kullanılan seçenekler şunlardır:
* sensitivity: Karşılaştırmanın ne kadar duyarlı olacağını belirler.
* 'base': Yalnızca temel harfleri karşılaştırır (büyük/küçük harf ve aksan işaretlerini göz ardı eder). Genellikle büyük/küçük harf duyarsız sıralama için kullanılır.
* 'accent': Temel harfleri ve aksan işaretlerini karşılaştırır, büyük/küçük harfleri göz ardı eder.
* 'case': Temel harfleri ve büyük/küçük harfleri karşılaştırır, aksan işaretlerini göz ardı eder.
* 'variant': Temel harfleri, aksan işaretlerini ve büyük/küçük harfleri karşılaştırır (varsayılan).
* caseFirst: Büyük/küçük harf sıralamasını belirler. 'upper' (büyük harfler önce), 'lower' (küçük harfler önce) veya 'false' (yerel ayara göre).
* numeric: true olarak ayarlanırsa, string içindeki sayısal değerleri sayı olarak karşılaştırır. Bu, “1”, “10”, “2” gibi stringlerin “1”, “2”, “10” olarak sıralanmasını sağlar (doğal sıralama).
Örnek: Büyük/Küçük Harf Duyarsız Türkçe Sıralama (sensitivity: 'base')
const mixedCaseNames = ['Ayşe', 'ali', 'Can', 'deniz'];
mixedCaseNames.sort((a, b) => a.localeCompare(b, 'tr', { sensitivity: 'base' }));
console.log(mixedCaseNames); // Çıktı: ["ali", "Ayşe", "Can", "deniz"]
// 'Ayşe' ve 'ali' aynı harf grubunda, yerel ayar ve 'base' sensitivity ile doğru sıralandı.
Örnek: Sayısal Stringlerin Doğal Sıralaması (numeric: true)
const versions = ['v1.0.10', 'v1.0.2', 'v1.0.1'];
versions.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log(versions); // Çıktı: ["v1.0.1", "v1.0.2", "v1.0.10"]
// Eğer numeric: false olsaydı: ["v1.0.1", "v1.0.10", "v1.0.2"] olurdu
localeCompare() metodu, string sıralaması için çok yönlü ve güçlü bir araçtır. Çoğu modern tarayıcıda ve Node.js ortamında tam olarak desteklenir.
Performans ve Büyük Veri Kümeleri
sort() metodunun performansı, kullanılan sıralama algoritmasına ve compareFunction‘ın karmaşıklığına bağlıdır. JavaScript motorları genellikle Timsort veya Quicksort gibi O(N log N) ortalama zaman karmaşıklığına sahip algoritmalar kullanır.
* Dizi Boyutu (N): Dizi ne kadar büyükse, sıralama o kadar uzun sürer. O(N log N) karmaşıklık, 1000 elemanlı bir dizi için 100 elemanlı bir diziden yaklaşık 10 kat daha yavaş olacağı anlamına gelmez; logaritmik faktör nedeniyle bu fark daha azdır, ancak yine de önemlidir.
* compareFunction‘ın Karmaşıklığı: Eğer compareFunction içinde karmaşık hesaplamalar, döngüler veya dış API çağrıları yapıyorsanız, bu her karşılaştırma için ek bir yük getirir ve genel sıralama süresini önemli ölçüde artırır. toLowerCase() veya localeCompare() gibi yerleşik string metotları genellikle optimize edilmiştir, ancak yine de her karşılaştırmada çağrıldıkları için dikkatli kullanılmalıdır.
* Bellek Kullanımı: sort() yerinde bir sıralama yaptığı için genellikle ek bellek ihtiyacı düşüktür (bazı algoritmalar küçük bir yardımcı dizi kullanabilir). Ancak, sıralamadan önce dizinin bir kopyasını alırsanız (slice()), bu dizinin boyutu kadar ek bellek kullanırsınız.
Büyük veri kümeleriyle çalışırken (örneğin on binlerce veya yüz binlerce eleman), performans kritik hale gelebilir. Bu durumlarda:
* compareFunction‘ın mümkün olduğunca basit ve hızlı olduğundan emin olun.
* Sıralamayı istemci tarafında yapmak yerine sunucu tarafında yapmayı düşünebilirsiniz.
* Eğer dizideki öğeler sıralamadan önce dönüştürülmesi gerekiyorsa (örneğin, stringleri sayıya çevirmek), bu dönüşümü bir kez yapıp bir önbellekte saklamak, her karşılaştırmada tekrar tekrar hesaplamaktan daha verimli olabilir.
Yaygın Hatalar ve Dikkat Edilmesi Gerekenler
sort() metodunu kullanırken yapılan bazı yaygın hatalar ve bunlardan kaçınmak için ipuçları:
1. Orijinal Dizinin Değişmesi
sort() metodunun orijinal diziyi değiştirdiğini unutmak, beklenmedik yan etkilere yol açabilir. Eğer orijinal diziyi korumak istiyorsanız, sıralamadan önce bir kopyasını oluşturun:
const originalArray = ['a', 'c', 'b'];
const sortedArray = originalArray.slice().sort(); // .slice() ile kopya oluştur
console.log(originalArray); // Çıktı: ["a", "c", "b"] - Orijinal dizi değişmedi
console.log(sortedArray); // Çıktı: ["a", "b", "c"]
2. Sayısal Stringleri Yanlış Sıralama
String dizileri içinde sayısal değerler varsa, varsayılan sıralama veya basit toLowerCase() karşılaştırması yanlış sonuçlar verecektir. Her zaman localeCompare()‘ın numeric: true seçeneğini veya özel bir sayısal karşılaştırma fonksiyonu kullanın.
const items = ['item 1', 'item 10', 'item 2'];
items.sort();
console.log(items); // Çıktı: ["item 1", "item 10", "item 2"] - Yanlış!
items.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log(items); // Çıktı: ["item 1", "item 2", "item 10"] - Doğru!
3. undefined veya null Değerlerle Çalışma
Diziniz undefined veya null değerler içeriyorsa, sort() metodu veya compareFunction‘ınız bu değerleri düzgün bir şekilde ele almayabilir ve hata fırlatabilir veya beklenmedik sonuçlar üretebilir. Bu tür değerleri sıralamadan önce filtrelemek veya compareFunction içinde özel olarak ele almak iyi bir uygulamadır.
const data = ['apple', null, 'banana', undefined, 'orange'];
// Bu tür bir diziyi doğrudan sıralamak hatalara yol açabilir veya null/undefined'ı string olarak işlemeye çalışır.
// Güvenli yaklaşım:
const cleanedData = data.filter(item => item !== null && item !== undefined);
cleanedData.sort((a, b) => a.localeCompare(b));
console.log(cleanedData); // Çıktı: ["apple", "banana", "orange"]
4. Karmaşık Veri Yapılarını Sıralama (Objelerin String Özelliklerine Göre)
Genellikle sadece string dizilerini değil, string özellikleri olan objelerden oluşan dizileri sıralamanız gerekir. Bu durumda, compareFunction içinde objelerin ilgili string özelliklerine erişmeniz gerekir.
const users = [
{ name: 'Ayşe', age: 30 },
{ name: 'ali', age: 25 },
{ name: 'Can', age: 35 }
];
users.sort((a, b) => a.name.localeCompare(b.name, 'tr', { sensitivity: 'base' }));
console.log(users);
/* Çıktı:
[
{ name: 'ali', age: 25 },
{ name: 'Ayşe', age: 30 },
{ name: 'Can', age: 35 }
]
*/
Gelişmiş Sıralama Senaryoları
Birden Fazla Kriterle Sıralama
Bir diziyi birden fazla kritere göre sıralamak (örneğin, önce isme, sonra yaşa göre) sık karşılaşılan bir senaryodur. compareFunction içinde bu mantığı uygulayabiliriz.
const products = [
{ name: 'Elma', category: 'Meyve', price: 10 },
{ name: 'Armut', category: 'Meyve', price: 12 },
{ name: 'Havuç', category: 'Sebze', price: 8 },
{ name: 'Portakal', category: 'Meyve', price: 10 }
];
products.sort((a, b) => {
// Önce kategoriye göre sırala (Türkçe, büyük/küçük harf duyarsız)
const categoryComparison = a.category.localeCompare(b.category, 'tr', { sensitivity: 'base' });
if (categoryComparison !== 0) {
return categoryComparison;
}
// Kategoriler eşitse, isme göre sırala (Türkçe, büyük/küçük harf duyarsız)
const nameComparison = a.name.localeCompare(b.name, 'tr', { sensitivity: 'base' });
if (nameComparison !== 0) {
return nameComparison;
}
// İsimler de eşitse, fiyata göre sırala (sayısal)
return a.price - b.price;
});
console.log(products);
/* Çıktı:
[
{ name: 'Armut', category: 'Meyve', price: 12 },
{ name: 'Elma', category: 'Meyve', price: 10 },
{ name: 'Portakal', category: 'Meyve', price: 10 },
{ name: 'Havuç', category: 'Sebze', price: 8 }
]
*/
Ters Sıralama (Descending Order)
Azalan (descending) sırada sıralama yapmak için, compareFunction‘ın dönüş değerini tersine çevirmeniz yeterlidir. Sayısal karşılaştırmalarda b - a kullanmak gibi, localeCompare() için de dönüş değerini negatifle çarpabilirsiniz.
const cities = ['Istanbul', 'ankara', 'Izmir', 'bursa'];
// Büyük/küçük harf duyarsız azalan sıralama
cities.sort((a, b) => {
return b.localeCompare(a, 'tr', { sensitivity: 'base' }); // a ve b'nin yerini değiştir
});
console.log(cities); // Çıktı: ["Izmir", "Istanbul", "bursa", "ankara"] - Yanlış, 'bursa' 'ankara'dan sonra gelmeliydi.
// Doğru azalan sıralama:
cities.sort((a, b) => {
return a.localeCompare(b, 'tr', { sensitivity: 'base' }) * -1; // Normal sıralamayı yap, sonra sonucu ters çevir
});
console.log(cities); // Çıktı: ["Izmir", "Istanbul", "bursa", "ankara"]
// Hata, bu sıralama da aynı sonucu verdi.
// Doğru azalan sıralama için:
cities.sort((a, b) => {
const comparison = a.localeCompare(b, 'tr', { sensitivity: 'base' });
return -comparison; // Karşılaştırma sonucunu ters çevir
});
console.log(cities); // Çıktı: ["Izmir", "Istanbul", "bursa", "ankara"]
// Yine aynı hata. Bunun nedeni, localeCompare'ın zaten belirli bir sıraya göre değer döndürmesi.
// A ve B'nin yerini değiştirmek en doğru yöntemdir.
const cities2 = ['Istanbul', 'ankara', 'Izmir', 'bursa'];
cities2.sort((a, b) => b.localeCompare(a, 'tr', { sensitivity: 'base' }));
console.log(cities2); // Çıktı: ["Izmir", "Istanbul", "bursa", "ankara"]
// Tekrar kontrol edelim:
const turkishCities = ['Adana', 'Çankırı', 'Bursa', 'Denizli'];
turkishCities.sort((a, b) => a.localeCompare(b, 'tr')); // Artan
console.log(turkishCities); // ["Adana", "Bursa", "Çankırı", "Denizli"]
turkishCities.sort((a, b) => b.localeCompare(a, 'tr')); // Azalan
console.log(turkishCities); // ["Denizli", "Çankırı", "Bursa", "Adana"]
// Evet, b.localeCompare(a, ...) doğru azalan sıralamayı sağlıyor.
Alternatif Sıralama Yaklaşımları (Kısa Bahsetme)
Nadiren de olsa, Array.prototype.sort()‘un performans veya esneklik açısından yetersiz kaldığı durumlar olabilir. Bu gibi durumlarda, üçüncü taraf kütüphaneler veya özel algoritmalar düşünülebilir:
* Lodash _.sortBy: Lodash gibi yardımcı kütüphaneler, daha deklaratif bir sözdizimi ve birden çok kritere göre sıralama için kolaylıklar sunar. Ancak, localeCompare() gibi yerel duyarlı sıralama özelliklerini genellikle doğrudan sağlamazlar ve yine de kendi compareFunction‘ınızı geçirmeniz gerekebilir.
* Özel Sıralama Algoritmaları: Çok büyük veri kümeleri veya çok özel sıralama gereksinimleri için, kendi sıralama algoritmanızı uygulamak (örneğin, radix sort gibi stringler için daha hızlı olabilecek algoritmalar) bir seçenek olabilir. Ancak bu, genellikle gereksiz bir karmaşıklıktır ve çoğu web uygulaması için Array.prototype.sort() yeterlidir.
Sonuç
JavaScript’in Array.prototype.sort() metodu, string dizilerini sıralamak için esnek ve güçlü bir araçtır. Varsayılan davranışının büyük/küçük harf duyarlı ve Unicode kod noktası tabanlı olduğunu anlamak, beklenmedik sonuçlardan kaçınmak için ilk adımdır.
Çoğu gerçek dünya senaryosunda, özellikle farklı dillerdeki metinlerle çalışırken, compareFunction ve String.prototype.localeCompare() metodunun gücünden yararlanmak esastır. localeCompare()‘ın locales ve options parametreleri sayesinde, büyük/küçük harf duyarsızlık, yerel dil kurallarına uygunluk ve sayısal stringlerin doğal sıralaması gibi karmaşık gereksinimleri kolayca karşılayabilirsiniz.
Performans ve yaygın hataları göz önünde bulundurarak, sort() metodunu bilinçli bir şekilde kullanmak, uygulamalarınızın daha sağlam, kullanıcı dostu ve uluslararasılaştırılmış olmasına yardımcı olacaktır. Doğru compareFunction‘ı seçmek ve localeCompare()‘ın sunduğu imkanları anlamak, JavaScript’te string sıralama ustası olmanın anahtarıdır.
