JavaScript’te “sort()” Metodu Kullanımı
JavaScript’te “sort()” metodu, dizi (array) içindeki elemanları sıralamak için kullanılan yerleşik bir fonksiyondur.
JavaScript’te “sort()” Metodu
Kelime anlamı olarak “sıralamak” anlamına gelen “sort()” metodu, dizi elemanlarını belirli bir kritere göre “yerinde sıralamak” için kullanılır.
“Yerinde sıralama” demek, sıralama işleminin mevcut dizi üzerinde gerçekleştirildiği ve yeni bir dizi oluşturulmadığı anlamına gelir. Yani bu da demektir ki, “sort()” metodu orijinal diziyi değiştirir ve sıralanmış bir şekilde bu diziyi döndürür.
“Peki, bunu nasıl yapar?” Metodumuz, dizi elemanlarını “string” olarak ele alır ve bunları Unicode noktasına göre alfabatik bir şekilde sıralar. Aşağıdaki örneği inceleyiniz:
1 2 3 |
let letters = ["z", "f", "a", "m", "b", "y", "c", "x", "e", "d"]; letters.sort(); console.log(letters); // ["a", "b", "c", "d", "e", "f", "m", "x", "y", "z"] |
Ancak belirtmek isterim ki örneğimizdeki harfler, her bir harfin karşılık geldiği “Unicode” kod noktalarına göre sıralanmıştır. Alfabetik sıralama olayı bizim alfabemiz için geçerli olmayacaktır. Bakınız:
1 2 3 |
let mixedLetters = ["ş", "a", "z", "ğ", "c", "ö", "b", "ü", "m", "t", "r", "s", "ç", "u", "f"]; mixedLetters.sort(); console.log(mixedLetters); // ["a","b","c","f","m","r","s","t","u","z","ç","ö","ü","ğ","ş"] |
Normal şartlarda Türkçe harf sıralamasına göre önde sıralanması gereken harflerin bu sıralamaya uymadığına dikkat edin. Bunun nedeni, “sort()” metodunun, diziyi “Unicode” kod noktalarına göre sıralamasıdır. Bu sıralama, Türkçe alfabesinin alışık olduğumuz sıralamasından farklıdır.
Özellikle “ç”, “ğ”, “ö”, “ş”, ve “ü” gibi Türkçe özel harfler, İngilizce harflerinden sonra gelen “Unicode” kod noktalarına sahiptir. Bu yüzden bu harfler, alfabemize göre beklenenden daha sonraki pozisyonlarda sıralanmıştır. Aşağıdaki tabloyu incediğinizde bu durumun daha da anlaşılır olacağını düşünüyorum:
Harf | Unicode Kod Noktası |
---|---|
A | U+0041 |
B | U+0042 |
C | U+0043 |
D | U+0044 |
E | U+0045 |
F | U+0046 |
G | U+0047 |
H | U+0048 |
I | U+0049 |
İ | U+0130 |
J | U+004A |
K | U+004B |
L | U+004C |
M | U+004D |
N | U+004E |
O | U+004F |
Ö | U+00D6 |
P | U+0050 |
Q | U+0051 |
R | U+0052 |
S | U+0053 |
Ş | U+015E |
T | U+0054 |
U | U+0055 |
Ü | U+00DC |
V | U+0056 |
W | U+0057 |
X | U+0058 |
Y | U+0059 |
Z | U+005A |
Ç | U+00C7 |
Ğ | U+011E |
Yukarıdaki tablomuz, harflerin “Unicode” kod noktalarına göre sıralanmasını göstermektedir. Harf sıralaması Türk alfabesine göre değil, “Unicode” kod noktalarına göre sıralıdır. Bu yüzden bazı Türkçe harfler, alfabemize göre beklenenden daha sonraki pozisyonlarda yer almaktadır.
Benzer şekilde kelimeleri de alfabetik olarak sıralayabiliriz. Aşağıdaki örneğimizde, kelimeleri oluşturan harflere göre harf harf sıralanmıştır.
1 2 3 |
var words = ["mango", "elma", "muz", "elbise", "f", "erik", "c"]; words.sort(); console.log(words); // ["c", "elbise", "elma", "erik", "f", "mango", "muz"] |
Bu örnekte, kelimeler alfabetik olarak sıralanmıştır. Sıralama, kelimelerin ilk harflerine göre yapılmıştır. Eğer ilk harfler aynıysa, sonraki harflere bakılır. Kelime uzunluğunun sıralamada bir etkisi yoktur. Örneğin, “elbise” kelimesi “elma” kelimesinden önce gelmektedir çünkü “elbise” kelimesindeki üçüncü harf olan “b” “elma” kelimesindeki üçüncü harf olan “m”den önce gelir. Bu nedenle “elbise” kelimesi sıralamada “elma” kelimesinden önce yer alır.
“Peki, sort()
metodu sayıları nasıl sıralar?” Aslında sort()
metodu, dizi elemanları sayısal bir değere sahip olsa bile matematiksel olarak değil de “string” olarak değerlendirilir ve sırlamayı “Unicode” noktalarına göre yapar. Bu nedenle ek işlem yapmamız gerekmektedir.
1 2 3 |
var numbers = [10, 5, 100, 25, 1]; numbers.sort(); console.log(numbers); // [1, 10, 100, 25, 5] |
Bu örnekte, sayıların beklenen doğal sıralamasının dışında bir sıralama ile listelendiğini görebilirsiniz. Bunun nedeni, sort()
metodunun sayıları “string” olarak değerlendirmesi ve Unicode kod noktalarına göre sıralamasıdır.
“Öyleyse sayısal değerlere sahip bir diziyi nasıl matematiksel olarak sıralayabiliriz?” Bu sorunu karşılaştırma fonksiyonu kullanarak aşabiliriz. Tipik bir karşılaştırma fonksiyonu aşağıdaki gibi yazılmaktadır:
function(a, b) { return a - b; }
Yukarıdaki örneğimizi karşılaştırma fonksiyonu kullanarak sıraladığımızda sorun çözülecektir. Bakınız:
1 2 3 4 5 6 |
var numbers = [10, 5, 100, 25, 1]; numbers.sort(function(a, b) { return a - b; }); console.log(numbers); // [1, 5, 10, 25, 100] |
Karşılaştırma fonksiyonunu arrow fonksiyonu ile kısaca yazabiliriz:
1 2 3 4 |
var numbers = [10, 5, 100, 25, 1]; numbers.sort((a, b) => a - b); console.log(numbers); // [1, 5, 10, 25, 100] |
Yukarıdaki örnekte, karşılaştırma fonksiyonu a-b
işlemini döndürür. Bu işleme göre aşağıdaki kurala göre bir sıralama olur:
- Eğer
a - b
negatif bir sayı döndürürse,a
,b
‘den önce yer alır. - Eğer
a - b
pozitif bir sayı döndürürse,b
,a
‘dan önce yer alır. - Eğer
a - b
sıfır döndürürse,a
veb
‘nin sıralaması değişmez.
Bu kod parçası, sayıları küçükten büyüğe sıralar. Eğer büyükten küçüğe sıralamak isterseniz, karşılaştırma fonksiyonunu b - a
olarak değiştirmeniz gerekir.
“sort()” Metodunun Avantajları ve Dezavantajları
JavaScript’te “sort()” metodunun çeşitli avantajları (➕) olduğu gibi bazı dezavantajları (➖) da bulunmaktadır. Bunlardan bazıları aşağıda derlenmiştir.
- ➕ Avantajları:
- Esneklik:
sort()
metodu, kullanıcı tarafından tanımlanan özel bir karşılaştırma fonksiyonu alabilir. - Yerinde Sıralama: Dizi üzerinde “yerinde” sıralama yapar, bu da ekstra bellek kullanımı olmadan dizi elemanlarının sıralanmasını sağlar.
- Kullanım Kolaylığı: Basit sıralama ihtiyaçları için oldukça kolay bir kullanıma sahiptir. Özel bir sıralama fonksiyonu yazmadan diziyi sıralayabilirsiniz.
- Esneklik:
- ➖ Dezavantajları:
- Performans Sorunları: Büyük veri setleri üzerinde, özellikle özelleştirilmiş sıralama fonksiyonlarıyla, performans sorunları yaşanabilir. Zira çok sayıda geçici değişken oluşturması büyük dizilerle çalışırken bellek kullanımını arttıracaktır.
- Varsayılan Sıralama Karışıklığı:
sort()
varsayılan olarak dizi elemanlarını “string” olarak sıralar, bu da sayısal sıralamalarda beklenmeyen sonuçlara neden olabilir. Bu durumları düzeltmek için bir karşılaştırma fonksiyonu kullanmak zorundayız.
Eleman Olarak “Nesne” Barındıran Dizilerde Sıralama
JavaScript’te sort()
metodu ile dizi öğelerini küçükten büyüğe veya büyükten küçüğe sıralayabiliriz. Ancak, bu sıralamayı belirlemek tamamen sağladığınız karşılaştırma fonksiyonuna bağlıdır. Bu sayede, sıralama işlemi çok özelleştirilebilir hale gelir.
Örneğin içinde, eleman olarak nesne barındıran aşağıdaki gibi bir dizimiz olduğunu düşünelim:
1 2 3 4 5 |
var people = [ { isim: 'Ahmet', yas: 30 }, { isim: 'Mehmet', yas: 20 }, { isim: 'Zeynep', yas: 25 } ]; |
Bu diziyi, kişilerin yaşlarına göre küçükten büyüğe sıralamak için sort()
metoduna bir karşılaştırma fonksiyonu yazabiliriz:
1 2 3 4 5 6 7 8 9 |
var people = [ { name: "Ahmet", age: 30 }, { name: "Mehmet", age: 20 }, { name: "Zeynep", age: 25 } ]; people.sort(function (a, b) { return a.age - b.age; }); |
Yukarıdaki kodumuz, people dizisini kişilerin yaşlarına göre küçükten büyüğe sıralar. Eğer alfabetik sıraya göre isimlerini sıralamak isterseniz, aşağıdaki gibi bir karşılaştırma fonksiyonu yazmalısınız:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var people = [ { name: "Ahmet", age: 30 }, { name: "Mehmet", age: 20 }, { name: "Zeynep", age: 25 } ]; people.sort(function (a, b) { if (a.name < b.name) { return -1; } if (a.name > b.name) { return 1; } return 0; }); |
Bu fonksiyonun dönüş değerleri olan 1, -1 ve 0 olmasının anlamları şunlardır:
- -1: Fonksiyon,
-1
değerini döndürdüğünde,a
nesnesinin sıralama sırasındab
nesnesinden önce gelmesi gerektiğini belirtir. Bu örnekte, eğera
nesnesininname
özelliğib
nesnesininname
özelliğinden alfabetik olarak daha önceyse,-1
döndürülür. - 1: Fonksiyon,
1
değerini döndürdüğünde,a
nesnesinin sıralama sırasındab
nesnesinden sonra gelmesi gerektiğini belirtir. Bu örnekte, eğera
nesnesininname
özelliğib
nesnesininname
özelliğinden alfabetik olarak daha sonraysa,1
döndürülür. - 0: Fonksiyon,
0
değerini döndürdüğünde,a
veb
nesnelerinin sıralama sırasında eşit olduğunu belirtir. Yani, bu iki nesnenin sıralama sırası değiştirilmez. Bu örnekte, eğera
nesnesininname
özelliğib
nesnesininname
özelliğiyle aynıysa,0
döndürülür.
Yukarıdaki örnekler, sort()
metodunun ne kadar esnek olduğunu ve sıralama işleminin nasıl özelleştirilebileceğini gösterir. İhtiyaçlarınıza bağlı olarak, neredeyse her türlü özelleştirmeyi sağlayabilecek bir karşılaştırma fonksiyonu yazabilirsiniz.