Bagaimanakah anda melaksanakan algoritma isihan semula jadi dalam JavaScript untuk tatasusunan yang mengandungi unsur alfanumerik campuran?

Susan Sarandon
Lepaskan: 2024-11-09 16:06:02
asal
970 orang telah melayarinya

How do you implement a natural sort algorithm in JavaScript for arrays containing mixed alphanumeric elements?

Isih Semulajadi Elemen Tatasusunan dengan Nombor dan Abjad

Menentukan susunan elemen tatasusunan yang mengandungi nilai berangka dan aksara abjad boleh menjadi mencabar. Isihan semula jadi diperlukan untuk mengendalikan senario ini, yang menyusun elemen berdasarkan nilai sebenar mereka.

Susun Sampel dan Hasil Yang Diingini

Pertimbangkan tatasusunan input berikut:

["IL0 Foo", "PI0 Bar", "IL10 Baz", "IL3 Bob says hello"]
Salin selepas log masuk

Tempahan diisih yang dikehendaki ialah:

["IL0 Foo", "IL3 Bob says hello", "IL10 Baz", "PI0 Bar"]
Salin selepas log masuk

Pendekatan Isih Naif

Fungsi perbandingan yang mudah, seperti yang disediakan, menyusun elemen hanya mengikut bahagian awal (2 huruf) dan mengabaikan bahagian berangka:

function compare(a, b) {
  if (a < b) return -1;
  if (a > b) return 1;
  return 0;
}
Salin selepas log masuk

Pelaksanaan Isih Semulajadi dalam JavaScript

Untuk mencapai isihan semula jadi, fungsi berikut boleh digunakan:

function naturalCompare(a, b) {
    var ax = [], bx = [];

    a.replace(/(\d+)|(\D+)/g, function(_, , ) { ax.push([ || Infinity,  || ""]) });
    b.replace(/(\d+)|(\D+)/g, function(_, , ) { bx.push([ || Infinity,  || ""]) });
    
    while(ax.length && bx.length) {
        var an = ax.shift();
        var bn = bx.shift();
        var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
        if(nn) return nn;
    }

    return ax.length - bx.length;
}
Salin selepas log masuk

Fungsi ini membahagikan setiap elemen kepada tatasusunan pasangan, di mana elemen pertama ialah nombor (atau Infiniti jika tiada nombor) dan elemen kedua ialah rentetan:

["IL0 Foo"] -> [["0", "IL"], ["Foo", ""]]
["PI0 Bar"] -> [["0", "PI"], ["Bar", ""]]
Salin selepas log masuk

Logik perbandingan kemudian membandingkan pasangan satu demi satu, memberi keutamaan kepada nilai berangka. Jika nilai berangka adalah sama, rentetan akan dibandingkan menggunakan localeCompare.

Contoh Penggunaan dan Hasil

Isih tatasusunan sampel menggunakan fungsi NaturalCompare:

test = [
    "img12.png",
    "img10.png",
    "img2.png",
    "img1.png",
    "img101.png",
    "img101a.png",
    "abc10.jpg",
    "abc10",
    "abc2.jpg",
    "20.jpg",
    "20",
    "abc",
    "abc2",
    ""
];

test.sort(naturalCompare)
Salin selepas log masuk

Tatasusunan yang diisih ialah:

["", "20", "20.jpg", "abc", "abc2", "abc2.jpg", "abc10", "abc10.jpg", "img1.png", "img2.png", "img10.png", "img12.png", "img101.png", "img101a.png"]
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah anda melaksanakan algoritma isihan semula jadi dalam JavaScript untuk tatasusunan yang mengandungi unsur alfanumerik campuran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan