JavaScript Sayılar Basitçe Sıralama neden çalışmıyor

array.sort() neden düzgünce çalışmıyor, en kolay nasıl çözüm bulunabilir

JavaScript’te sayılarda array.sort() neden doğru sıralama yapmıyor ?

1. dizi.sort() bağımsız değişkenler olmadan

array.sort(), diziyi yerinde sıralayan (orijinal diziyi değiştirir) ve sıralanan diziyi döndüren bir yöntemdir.

Argümanlar olmadan çağrıldığında, dizi öğeleri dizelere dönüştürülür ve alfabetik olarak sıralanır.

Örneğin, bir harf dizisini sıralayalım:

const harfler = ["x", "c", "a", "b"];
harfler.sort(); // => ["a", "b", "c", "x"]

Göründüğü gibi alfabetik olarak sıralanmıştır.

Ne yazık ki, yöntemi sayılar üzerinde çağırmak aynı alfabetik sıralamayı gerçekleştirir:

const sayilar = [10, 5, 11];
sayilar.sort(); // => [10, 11, 5]

Yöntem, sayısal değerleri yerine alfabetik olarak sıralanmış sayılara sahip [10, 11, 5] dizisini döndürür.

2. bir karşılaştırıcı ile array.sort()

Neyse ki, array.sort() yöntemi isteğe bağlı bir fonksiyonu kabul eder: karşılaştırıcı işlevi.

const array = dizi.sort([func]);

Bu işlevi kullanarak, sıralama sırasında öğelerin dizide nasıl sıralanacağını kontrol edilebilir.

func(a, b) döndürürse:

Negatif bir sayı <0: sonra a, b’nin önüne yerleştirilir Pozitif bir sayı > 0: o zaman b, a’nın önüne yerleştirilir Sıfır 0: o zaman karşılaştırılan öğelerin konumu değişmez

Sayıları artan düzende doğru şekilde sıralamak için örnek fonksiyon:

const sayilar = [10, 5, 11];

sayilar.sort((a, b) => {
  if (a < b) {
    return -1;
  }
  if (a > b) {
    return 1;
  }
  return 0;
}); // => [5, 10, 11]

array.sort(func) artık sayıları doğru bir şekilde sıralıyor: [5, 10, 11].

Artan düzende sıralanmış bir dizide, daha küçük sayı, daha büyük olandan önce konumlandırılır. Karşılaştırıcı fonksiyonu kodlarken korumanız gereken özellik budur:

a < b — işlev -1 döndürürse, a'yı b'nin önüne yerleştirir (ör. 5 < 8, dolayısıyla 5, 8'den öncedir)

a > b — fonksiyon 1 döndürürse, b'yi a'nın önüne yerleştirir (ör. 10 > 3, dolayısıyla 3, 10'dan öncedir)

a === b ise — sıra değişmez.

Önceki örnekteki karşılaştırıcı fonksiyon nispeten uzundur. Neyse ki, sadece argümanları farklılaştırarak basitleştirilebilir:

const sayilar = [10, 5, 11];
sayilar.sort((a, b) => a - b); // => [5, 10, 11]

(a, b) => a - b, sayıları sıralamak için kısa bir fonksiyondur. JavaScript’teki sayı dizisini sıralamak için bu yolu öneririm.

3. Yazılan bir dizi kullanarak sıralama

JavaScript’te yazılan diziler, belirli bir türden öğeler içerir, ör. UInt8: 8 bit işaretsiz tam sayılar, Float64: 64 bit kayan noktalı sayılar. Bu, öğelerin herhangi bir türden olabileceği, hatta türlerin karışımı olabileceği normal dizinin aksine.

Yazılan dizilerle ilgili iyi olan şey, onların sort() yönteminin varsayılan olarak sayılar üzerinde artan düzende bir sıralama gerçekleştirmesidir.

Bir karşılaştırıcı işlevi kullanmadan sayıları sıralamak için yapmacık bir yaklaşım, yazılan bir diziyi kullanmaktır:

const sayilar = [10, 5, 11];
const sirala = [...new Float64Array(sayilar).sort()];

sirala; // => [5, 10, 11]

new Float64Array(sayilar), sayılar dizisinden sayılarla başlatılan, yazılan bir dizinin bir örneğini oluşturur.

new Float64Array(sayilar).sort(), yazılan dizinin numaralarını artan düzende sıralar. Bir karşılaştırıcı fonksiyona gerek olmadığını unutmayın.

Son olarak, yayılma operatörü ile […new Float64Array(sayilar).sort()], yazılan diziden sıralanmış sayıları normal bir diziye çıkarır.

4. Collator kullanarak sıralama

Dizinin elemanlarının sayı ile başlama durumunda bu yöntem en kullanışlı olanı

const liste = [
  `8. "Müslüm Gürses`,
  `5. "Selehattin Özdemir`,
  `3. "Metin Işık`,
  `10. "Azer Bülbül`,
  `1. "Engin Nurşani`,
  `7. "Cengiz Kurtoğlu`,
  `2. "Ferdi Tayfur`,
  `9. "Orhan Gencebay`,
  `6. "İbrahim Erkal`,
  `4. "Mustafa Keser`,
]

const collator = new Intl.Collator(undefined, { 
  numeric: true,
  sensitivity: 'base' 
})

liste.sort((a, b) => collator.compare(a, b))