Ini nomor versi perangkat lunak:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
Bagaimana saya bisa membandingkan ini ?? Asumsikan urutan yang benar adalah:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
Idenya sederhana ...: Baca digit pertama, daripada, yang kedua, setelah itu yang ketiga .... Tapi saya tidak bisa mengonversi nomor versi menjadi angka float .... Anda juga dapat melihat nomor versi seperti ini:
"1.0.0.0", "1.0.1.0", "2.0.0.0", "2.0.0.1", "2.0.1.0"
dan ini lebih jelas untuk melihat apa ide di balik ... Tapi, bagaimana cara mengubahnya menjadi program komputer ?? Adakah yang tahu bagaimana cara menyortir ini? Terima kasih.
javascript
sorting
Tattat
sumber
sumber
Jawaban:
Ide dasar untuk membuat perbandingan ini adalah menggunakan
Array.split
untuk mendapatkan array bagian dari string input dan kemudian membandingkan pasangan bagian dari dua array; jika bagian tidak sama kita tahu versi mana yang lebih kecil.Ada beberapa detail penting yang perlu diingat:
Berikut kode untuk implementasi yang dapat Anda gunakan secara langsung ( intinya dengan dokumentasi ):
Versi ini membandingkan bagian secara alami , tidak menerima sufiks karakter dan menganggap "1.7" lebih kecil dari "1.7.0". Mode perbandingan dapat diubah menjadi leksikografis dan string versi yang lebih pendek dapat secara otomatis diisi dengan nol menggunakan argumen ketiga opsional.
Ada JSFiddle yang menjalankan "unit test" di sini ; ini adalah versi yang sedikit diperluas dari karya ripper234 (terima kasih).
Catatan penting: Kode ini menggunakan
Array.map
danArray.every
, yang berarti tidak akan berjalan dalam versi IE lebih awal dari 9. Jika Anda perlu mendukung mereka, Anda harus menyediakan polyfill untuk metode yang hilang.sumber
semver
Parser versi semantik digunakan oleh npm.
instal semver $ npm
Tautan Versi Semantik :
https://www.npmjs.com/package/semver#prerelease-identifiers
sumber
sumber
var len = Math.min(a_components.length, b_components.length);
akan menyebabkan versi 2.0.1.1 dan 2.0.1 diperlakukan sama?a = '7'
danb = '7.0'
mengembalikan-1
karena 7.0 lebih panjang. Ada saran untuk itu? (console.log(compare("7", "7.0")); //returns -1
)Fungsi perbandingan yang sangat kecil, namun sangat cepat ini membutuhkan nomor versi dengan panjang berapa pun dan ukuran nomor apa pun per segmen .
Nilai
pengembalian : - angka
< 0
jika a <b- angka
> 0
jika a> b-
0
jika a = bJadi Anda dapat menggunakannya sebagai fungsi perbandingan untuk Array.sort ();
EDIT: Versi Bugfixed menelanjangi angka nol untuk mengenali "1" dan "1.0.0" sebagai sama
sumber
["0.0.0", "0.0", "0.4.1", "0.5", "1.0.0", "1", "1.1", "1.2.15", "1.25.4", "2", "2.5.0", "2.5.10", "2.5.10.4159", "10.5"]
mana output kode Anda["0.0", "0.0.0", "0.4.1", "0.5", "1", "1.0.0", "1.1", "1.2.15", "1.25.4", "2", "2.5.0", "2.5.10", "2.5.10.4159", "10.5"]
, yang sama persis, karena 0,0 dan 0,0,0 dianggap sama , yang berarti tidak relevan apakah '0,0' sebelum '0,0,0' atau sebaliknya.Diambil dari http://java.com/js/deployJava.js :
sumber
Tidak dapat menemukan fungsi melakukan apa yang saya inginkan di sini. Jadi saya menulis sendiri. Ini kontribusi saya. Semoga ada yang berguna.
Pro:
Menangani string versi dengan panjang sewenang-wenang. '1' atau '1.1.1.1.1'.
Default setiap nilai ke 0 jika tidak ditentukan. Hanya karena sebuah string lebih panjang bukan berarti itu versi yang lebih besar. ('1' harus sama dengan '1.0' dan '1.0.0.0'.)
Bandingkan angka bukan string. ('3' <'21' harus benar. Tidak salah.)
Jangan buang waktu untuk membandingkan yang tidak berguna dalam loop. (Membandingkan dengan ==)
Anda dapat memilih pembanding sendiri.
Cons:
Kode saya, mirip dengan jawaban yang diterima oleh Jon :
Contoh :
sumber
Fungsi sederhana dan pendek:
Tes:
sumber
Maafkan saya jika ide ini sudah dikunjungi di tautan yang belum saya lihat.
Saya telah berhasil dengan konversi bagian menjadi jumlah tertimbang seperti:
Yang membuat perbandingan sangat mudah (membandingkan ganda). Bidang versi kami tidak pernah lebih dari 4 digit.
Saya harap ini membantu seseorang, karena beberapa persyaratan tampak sedikit berlebihan.
sumber
Berikut ini adalah versi pendek lain yang berfungsi dengan sejumlah sub versi, angka nol dan bahkan angka dengan huruf (1.0.0b3)
Keluaran:
0 : a = b
1 : a> b
-1 : a <b
Tampilkan cuplikan kode
https://jsfiddle.net/vanowm/p7uvtbor/
sumber
2017 jawaban:
Kode paling sederhana untuk peramban modern:
Idenya di sini adalah untuk membandingkan angka tetapi dalam bentuk string. untuk membuat perbandingan berfungsi, kedua string harus memiliki panjang yang sama. begitu:
"123" > "99"
menjadi"123" > "099"
padding nomor pendek "perbaiki" perbandingan
Di sini saya mengisi setiap bagian dengan nol dengan panjang 10. Kemudian gunakan string sederhana untuk membandingkan jawabannya
Contoh:
sumber
compareVersion2
apa yang sebenarnya terjadi?substring
bukanpadStart
untuk kompatibilitas yang lebih baik yaituvar zeros = "0000000000"; '0.2.32'.split('.').map( s => zeros.substring(0, zeros.length-s.length) + s ).join('.')
akan memberi Anda0000000000.0000000002.0000000032
:)Memeriksa fungsi
version_compare()
dari proyek php.js . Ini mirip dengan PHPversion_compare()
.Anda cukup menggunakannya seperti ini:
sumber
Jawaban verbose saya kurang dari sebagian besar jawaban di sini
sumber
Meskipun pertanyaan ini sudah banyak jawaban, masing-masing mempromosikan solusi halaman belakang mereka sendiri, sementara kami memiliki seluruh ekosistem perpustakaan (pertempuran) yang teruji untuk ini.
Pencarian cepat pada NPM , GitHub , X akan memberi kita beberapa lib yang indah, dan saya ingin menjalankan beberapa:
semver-compare
adalah lib yang sangat ringan (~ 230B) yang sangat berguna jika Anda ingin mengurutkan berdasarkan nomor versi, karena metode pustaka yang terbuka mengembalikan-1
,0
atau secara1
tepat.Inti dari lib:
compare-semver
ukurannya lumayan besar (~ 4.4kB gzipped), tetapi memungkinkan untuk beberapa perbandingan unik yang bagus seperti menemukan min / max dari tumpukan versi atau untuk mengetahui apakah versi yang disediakan unik atau kurang dari apa pun dalam koleksi versi.compare-versions
adalah lib kecil lainnya (~ 630B gzipped) dan mengikuti spec dengan baik, artinya Anda dapat membandingkan versi dengan flag alpha / beta dan bahkan wildcard (seperti untuk versi minor / patch:1.0.x
atau1.0.*
)Intinya: tidak selalu perlu menyalin-menempelkan kode dari StackOverflow, jika Anda dapat menemukan versi yang layak, (unit-) yang diuji melalui manajer paket pilihan Anda.
sumber
Saya menghadapi masalah yang sama, dan saya sudah membuat solusi untuk itu. Jangan ragu untuk mencobanya.
Ini mengembalikan
0
untukequal
,1
jika versigreater
dan-1
jika ituless
sumber
Idenya adalah membandingkan dua versi dan tahu mana yang terbesar. Kami menghapus "." dan kami membandingkan setiap posisi vektor dengan yang lain.
sumber
sumber
The
replace()
Fungsi hanya menggantikan kejadian pertama dalam string. Jadi, mari kita ganti.
dengan,
. Setelah itu hapus semua.
dan buat,
untuk.
lagi dan mengurai mengapung.akhirnya, urutkan:
sumber
Lihat posting blog ini . Fungsi ini berfungsi untuk nomor versi numerik.
sumber
Jika, misalnya, kami ingin memeriksa apakah versi jQuery saat ini kurang dari 1,8,
parseFloat($.ui.version) < 1.8 )
akan memberikan hasil yang salah jika versi "1.10.1", karena parseFloat ("1.10.1") kembali1.1
. Perbandingan string juga akan salah, karena"1.8" < "1.10"
dievaluasi menjadifalse
.Jadi kita perlu tes seperti ini
Fungsi berikut menangani ini dengan benar:
Berikut ini beberapa contohnya:
Lihat di sini untuk contoh langsung dan rangkaian tes: http://jsfiddle.net/mar10/8KjvP/
sumber
Berikut adalah implementasi naskah kopi yang cocok untuk digunakan dengan Array.sort yang terinspirasi oleh jawaban lain di sini:
sumber
Saya menulis modul simpul untuk menyortir versi, Anda dapat menemukannya di sini: version-sort
Fitur :
Jangan ragu untuk membuka masalah jika Anda membutuhkan fitur lain.
sumber
Ini berfungsi untuk versi numerik dari panjang mana pun yang dipisahkan oleh titik. Ia mengembalikan true hanya jika myVersion adalah> = minimumVersion, membuat asumsi bahwa versi 1 kurang dari 1.0, versi 1.1 kurang dari 1.1.0 dan seterusnya. Seharusnya cukup sederhana untuk menambahkan kondisi tambahan seperti menerima angka (hanya mengkonversi ke string) dan heksadesimal atau membuat pembatas dinamis (cukup tambahkan parameter pembatas kemudian ganti "." Dengan param)
Berikut ini beberapa tes:
Atau di sini adalah versi rekursif
sumber
Saya menemukan cara paling sederhana untuk membandingkannya, tidak yakin apakah itu yang Anda inginkan. ketika saya menjalankan kode di bawah ini di konsol, itu masuk akal, dan menggunakan metode sort (), saya bisa mendapatkan array yang diurutkan dari string versi. ini didasarkan pada urutan abjad.
sumber
Anda bisa menggunakannya
String#localeCompare
bersamaoptions
sumber
undefined
atas, Bahasa? Kenapa Anda bisa memposting ini sementara saya membaca yang lain;)undefined
adalah bagian locales, tidak digunakan di sini.tidak bisakah Anda mengonversinya menjadi angka dan kemudian mengurutkan setelah ukuran? Tambahkan angka 0 ke angka yang panjangnya <4
bermain-main di konsol:
semakin besar versinya, semakin besar jumlahnya. Sunting: mungkin perlu disesuaikan ke akun untuk seri versi yang lebih besar
sumber
Ini adalah trik yang rapi. Jika Anda berurusan dengan nilai numerik, di antara rentang nilai tertentu, Anda dapat menetapkan nilai untuk setiap level objek versi. Misalnya "Nilai terbesar" diatur ke 0xFF di sini, yang menciptakan semacam tampilan "IP" untuk versi Anda.
Ini juga menangani versi alpha-numeric (yaitu 1.2a <1.2b)
sumber
Saya suka versi dari @ mar10 , meskipun dari sudut pandang saya, ada kemungkinan kesalahan penggunaan (sepertinya tidak demikian jika versi kompatibel dengan dokumen Semantic Versioning , tetapi mungkin demikian halnya jika beberapa "nomor build" digunakan ):
Masalahnya di sini adalah bahwa sub-nomor nomor versi, dalam beberapa kasus, ditulis dengan nol trailing cut out (setidaknya seperti yang baru-baru ini saya lihat saat menggunakan perangkat lunak yang berbeda), yang mirip dengan bagian rasional dari angka, jadi:
Sub-nomor versi pertama (atau keduanya pertama dan kedua), bagaimanapun, selalu diperlakukan sebagai nilai integer yang sebenarnya sama dengan.
Jika Anda menggunakan versi semacam ini, Anda dapat mengubah beberapa baris saja dalam contoh:
Jadi setiap sub-angka kecuali yang pertama akan dibandingkan sebagai float, jadi
09
dan1
akan menjadi0.09
dan0.1
sesuai dan dibandingkan dengan benar dengan cara ini.2054
dan3
akan menjadi0.2054
dan0.3
.Versi lengkapnya adalah (kredit ke @ mar10 ):
PS Ini lebih lambat, tetapi juga mungkin untuk berpikir tentang menggunakan kembali fungsi perbandingan yang sama yang mengoperasikan fakta bahwa string sebenarnya adalah array karakter:
sumber
Saya membuat ini berdasarkan ide Kons, dan dioptimalkan untuk versi Java "1.7.0_45". Itu hanya fungsi yang dimaksudkan untuk mengubah string versi menjadi float. Ini fungsinya:
String "1.7.0_45" dikonversi ke 1.0070000450000001 dan ini cukup baik untuk perbandingan normal. Kesalahan dijelaskan di sini: Bagaimana cara menangani presisi angka floating point dalam JavaScript? . Jika membutuhkan lebih dari 3 digit pada bagian mana pun Anda dapat mengubah pembagi
Math.pow(10, i * 3);
.Output akan terlihat seperti ini:
sumber
Saya memiliki masalah perbandingan versi yang sama, tetapi dengan versi yang mungkin mengandung apa pun (yaitu: pemisah yang bukan titik, ekstensi seperti rc1, rc2 ...).
Saya menggunakan ini, yang pada dasarnya membagi string versi menjadi angka dan bukan angka, dan mencoba membandingkannya dengan tipenya.
Ada beberapa asumsi di sini untuk beberapa kasus, misalnya: "1.01" === "1.1", atau "1,8" <"1,71". Gagal mengelola "1.0.0-rc.1" <"1.0.0", seperti yang ditentukan oleh Semantic versi 2.0.0
sumber
Memproses ulang versi sebelum pengurutan berarti parseInt tidak dipanggil beberapa kali secara tidak perlu. Menggunakan peta Array yang mirip dengan saran Michael Deal, berikut adalah jenis yang saya gunakan untuk menemukan versi terbaru dari semver 3 bagian standar:
sumber