Mencoba untuk mendapatkan nilai tertinggi dan terendah dari array yang saya tahu hanya akan berisi bilangan bulat tampaknya lebih sulit daripada yang saya kira.
var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)
Saya berharap ini untuk ditampilkan 99, 104, 140000
. Sebaliknya itu menunjukkan 104, 140000, 99
. Jadi sepertinya jenis ini menangani nilai sebagai string.
Apakah ada cara untuk mendapatkan fungsi sortir untuk benar-benar mengurutkan nilai integer?
javascript
arrays
sorting
numbers
peirix
sumber
sumber
NaN
. Akan menyenangkan untuk melihat jawaban berperingkat tinggi yang berhubungan denganNaN
.Jawaban:
Secara default, metode sortir mengurutkan elemen berdasarkan abjad. Untuk mengurutkan secara numerik cukup tambahkan metode baru yang menangani jenis angka (sortNumber, ditunjukkan di bawah) -
Di ES6, Anda dapat menyederhanakan ini dengan fungsi panah:
Dokumentasi:
Mozilla
Array.prototype.sort()
merekomendasikan fungsi perbandingan ini untuk array yang tidak mengandung Infinity atau NaN. (KarenaInf - Inf
NaN, bukan 0).Juga contoh menyortir objek dengan kunci.
sumber
numberArray.sort((a, b) => (a - b));
Yay! Saya pikir ini dekat dengan cara out-of-the-box. Catatan: periksa apakah mesin JS Anda mendukung Fungsi Panah.Hanya dengan membangun semua jawaban di atas, mereka juga dapat dilakukan dalam satu baris seperti ini:
sumber
var arr = [140000, 104, 99].sort(function(a,b) { return a-b; });
. Atau lebih ringkas, di ES6let arr = [140000, 104, 99].sort((a,b) => a-b);
function
danreturn
, tetapi sebenarnya tidak menggunakan tujuan sebenarnya dari fungsi panah untuk meneruskanthis
. Kode ini menyiratkan ada beberapathis
konteks yang lewat terjadi, tetapi tidak ada. Membingungkan bagi pengembang lain untuk membaca kode Anda, hanya untuk menyimpan beberapa karakter. Jangan bergantung pada efek samping - kode dengan tujuan!this
ke dalam fungsi tetapi itu tidak benar. Ini sebenarnya lalai untuk membuatthis
danarguments
variabel yang biasanya menimpa variabel induk. Satu-satunya alasan Anda dapat menggunakanthis
di dalam fungsi panah adalah pelingkupan leksikal.array.sort melakukan pengurutan leksikografis secara default, untuk pengurutan numerik, berikan fungsi Anda sendiri. Berikut ini contoh sederhana:
Perhatikan juga bahwa sorting berfungsi "di tempat", tidak perlu untuk penugasan.
sumber
Jawaban ini setara dengan beberapa jawaban yang ada, tetapi fungsi panah ECMAScript 6 memberikan sintaks yang jauh lebih kompak yang memungkinkan kami untuk mendefinisikan fungsi inline sort tanpa mengorbankan keterbacaan:
Ini didukung di sebagian besar browser saat ini .
sumber
objArray=objArray.sort((a,b)=>a.numProperty - b.numProperty);
dan jika properti adalah string yang dapat Anda lakukan:objArray=objArray.sort((a,b)=>a.strProperty.localeCompare(b.strProperty));
Yang telah dikatakan, pertanyaan ini secara spesifik menanyakan tentang pengurutan array bilangan bulatSaya terkejut mengapa semua orang merekomendasikan untuk melewatkan fungsi pembanding
sort()
, yang membuat penyortiran menjadi sangat lambat!Untuk mengurutkan angka, cukup buat TypedArray apa saja :
sumber
Alasan mengapa fungsi sort berperilaku sangat aneh
Dari dokumentasi :
Jika Anda mencetak nilai unicode point dari array maka itu akan menjadi jelas.
Ini mengembalikan: "49, 49, 57".
Sekarang, karena 140000 dan 104 mengembalikan nilai yang sama (49) itu memotong indeks pertama dan memeriksa lagi:
Jika kita menyortir ini, maka kita akan mendapatkan:
jadi 104 datang sebelum 140000.
Jadi hasil akhirnya adalah:
104, 140000, 99
Kesimpulan:
sort()
tidak menyortir dengan hanya melihat indeks angka pertama.sort()
tidak peduli jika bilangan bulat lebih besar dari yang lain, ia membandingkan nilai unicode dari digit, dan jika ada dua nilai unicode yang sama, maka ia memeriksa apakah ada digit berikutnya dan membandingkannya juga.Untuk mengurutkan dengan benar, Anda harus melewati fungsi bandingkan agar
sort()
seperti dijelaskan di sini .sumber
Saya setuju dengan aks, namun alih-alih menggunakan
Kamu harus menggunakan
sumber
>
dan<
masih membandingkan a dan b sebagai string.Di dunia ES6 baru itu jauh lebih mudah dilakukan sejenis
Itulah yang Anda butuhkan :)
sumber
Dalam JavaScript, perilaku default metode sort () adalah untuk mengurutkan nilai-nilai dalam array secara abjad.
Untuk mengurutkan berdasarkan angka Anda harus mendefinisikan fungsi pengurutan angka (yang sangat mudah):
sumber
Array.prototype.sort () adalah metode buka untuk menyortir array, tetapi ada beberapa masalah yang perlu kita waspadai.
Urutan penyortiran adalah secara default leksikografis dan bukan numerik terlepas dari jenis nilai dalam array. Bahkan jika array adalah semua angka, semua nilai akan dikonversi ke string dan diurutkan secara leksikografis.
Jadi sebaiknya kita perlu menyesuaikan metode sort () dan reverse () seperti di bawah ini.
URL yang dirujuk
Untuk menyortir angka di dalam array
Untuk membalikkan angka di dalam array
URL yang dirujuk
sumber
Pertanyaannya sudah dijawab, cara terpendek adalah menggunakan
sort()
metode. Tetapi jika Anda mencari lebih banyak cara untuk mengurutkan susunan angka, dan Anda juga menyukai siklus, periksa yang berikut iniJenis penyisipan
Naik:
Menurun:
Sortir seleksi:
Naik:
Menurun:
Selamat bersenang-senang
sumber
sort()
pada TypedArray seperti jawaban ini sarankan . Tentu saja mereka tidak akan lebih cepat untuk array sedang hingga besar karena ini adalah algoritma O (n ^ 2).Fungsi 'numerik' di bawah ini berfungsi untuk menyortir array angka secara numerik dalam banyak kasus ketika disediakan sebagai fungsi panggilan balik:
Namun dalam beberapa kasus yang jarang terjadi, di mana array berisi angka yang sangat besar dan negatif, kesalahan overflow dapat terjadi karena ab menjadi lebih kecil daripada angka terkecil yang bisa diatasi oleh JavaScript.
Jadi cara yang lebih baik untuk menulis fungsi numerik adalah sebagai berikut:
sumber
DBL_MIN - DBL_MAX
) tetapi underflow tidak mungkin. Pembatalan katastropik membuat hasilnya tidak tepat, kehilangan sebagian besar "digit signifikan" -nya, tetapia-b
akan selalu menjadi nol dan memiliki tanda yang tepat untuk a! = B.untuk menangani undefined, null, dan NaN: Null berperilaku seperti 0, NaN dan undefined berakhir.
sumber
Hanya untuk array normal dari nilai elemen:
Untuk berbagai objek:
sumber
Bentuk favorit pribadi saya dari fungsi ini memungkinkan param untuk Ascending, atau Descending:
Penggunaan sesederhana:
jsFiddle
Atau Contoh Cuplikan Kode Di Sini!
.smartSort ('asc' | 'desc')
Sekarang bersenang-senanglah dengan metode pengurutan yang mengurutkan array yang penuh dengan banyak item! Saat ini tidak mencakup "asosiatif" (alias, kunci string), tetapi mencakup semua jenis nilai! Tidak hanya akan mengurutkan beberapa nilai
asc
ataudesc
sesuai, tetapi juga akan mempertahankan "posisi" konstan dari "kelompok" nilai. Dengan kata lain; int selalu pertama, lalu datang string, lalu array (ya, saya membuat multidimensi ini!), lalu Objects (tanpa filter, elemen, tanggal), & akhirnya undefined dan null!"Mengapa?" Anda bertanya. Kenapa tidak!
Sekarang hadir dalam 2 rasa! Yang pertama membutuhkan browser yang lebih baru karena menggunakan
Object.defineProperty
untuk menambahkan metode keArray.protoype
Object. Hal ini memungkinkan untuk kemudahan alami digunakan, seperti:myArray.smartSort('a')
. Jika Anda perlu menerapkan untuk browser lama, atau Anda tidak suka memodifikasi Objek asli, gulir ke bawah ke versi Metode Saja .jsFiddle Array.prototype.smartSort ('asc | desc')
Gunakan itu sederhana! Pertama buat beberapa array gila seperti:
Maka cukup urutkan saja!
Hanya Metode
Sama seperti sebelumnya, kecuali hanya sebagai metode sederhana!
Menggunakan:
Metode jsFiddle smartSort (Array, "asc | desc")
sumber
Coba kode ini:
HTML:
Kode JavaScript:
sumber
Coba kode ini seperti di bawah ini
sumber
sumber
Meskipun tidak diperlukan dalam JavaScript, jika Anda ingin mengembalikan -1, 0, atau 1 secara ketat (mirip dengan cara operator pesawat ruang angkasa bekerja di PHP), maka Anda dapat menggunakannya .
sort()
compareFunction
Math.sign()
Di
compareFunction
bawah ini secara ketat mengembalikan -1, 0, atau 1:sumber
Ini adalah solusi yang sudah diajukan dan diterima sebagai metode pada prototipe Array:
sumber
Metode sort mengubah elemen-elemen Array menjadi string. Jadi, cara di bawah ini juga berfungsi dengan baik dengan angka desimal dengan elemen array.
Dan memberi Anda hasil yang diharapkan.
sumber
Mengganti metode pengurutan.
sumber
Fungsi sortir default adalah sortir dalam urutan kamus:
Yang di atas bukan kasus yang kita inginkan untuk angka. Jadi, jika Anda memiliki bilangan bulat dan fungsi pengurutan default tidak berfungsi (karena mengurutkan dalam urutan kamus) maka Anda harus mengimplementasikan fungsi Anda sendiri:
Saya harap Anda memiliki pertanyaan dalam benaknya bagaimana cara kerjanya? Di sini, ketika kami menyediakan metode dalam fungsi sortir, ia melewati dua angka setiap kali dan jika angka itu kembali
Dengan mengikuti ini untuk semua angka itu mengurutkan array bilangan bulat.
Jika Anda menggunakan ES6 maka tulis fungsi panah:
sumber
Berikut ini adalah fungsi susunan array saya di perpustakaan utils:
sumber
a-b
harus digunakan sebagai gantinya. (Anda bisa menyukai dan melakukanNumber(a>b)-0.5
, namun itu masih belum stabil).