Saya memiliki array multidimensi. Larik utama adalah larik
[publicationID][publication_name][ownderID][owner_name]
Apa yang saya coba lakukan adalah mengurutkan array berdasarkan owner_name
dan kemudian oleh publication_name
. Saya tahu di JavaScript yang Anda miliki Array.sort()
, di mana Anda dapat menempatkan fungsi khusus, dalam kasus saya, saya punya:
function mysortfunction(a, b) {
var x = a[3].toLowerCase();
var y = b[3].toLowerCase();
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}
Ini bagus untuk hanya menyortir pada kolom satu, yaitu OWNER_NAME, tapi bagaimana saya memodifikasi untuk mengurutkan owner_name
, maka publication_name
?
javascript
algorithm
sorting
flavour404
sumber
sumber
[[A, 10], [J, 15], [A, 5], [J, 5]] => [[A, 10], [A, 5], [J, 15], [J, 5]]
Saya pikir yang Anda cari adalah thenBy.js: https://github.com/Teun/thenBy.js
Ini memungkinkan Anda untuk menggunakan Array.sort standar, tetapi dengan
firstBy().thenBy().thenBy()
gaya.Contohnya bisa dilihat disini .
sumber
thenBy
dipanggil, semua item array diulangi lagi.Cara yang baik untuk mengurutkan pada banyak bidang yang merupakan string adalah dengan menggunakan
toLocaleCompare
dan operator boolean||
.Sesuatu seperti:
Jika Anda ingin mengurutkan pada lebih banyak bidang, Anda cukup mengikatnya dari pernyataan return dengan lebih banyak operator boolean.
sumber
.reduce()
.localCompare()
mengembalikan -1, 0, 1 jadi menurut saya solusi Anda tidak akan berfungsi sebagai || baik untuk booleansortItems = (a, b) => (a.distance - b.distance) || (a.name - b.name);
dan ini bekerja seperti pesona untuk kebutuhan saya yang tidak pilih-pilih.(a.name - b.name)
kecuali diperlukan. Membuat variabel terlebih dahulu melakukan pekerjaan tambahan meskipun tidak diperlukan.Menemukan kebutuhan untuk melakukan pengurutan array objek asc dan desc gaya SQL dengan kunci.
Solusi kennebec di atas membantu saya mencapai ini:
penggunaan sampel:
menghasilkan yang berikut:
(menggunakan fungsi cetak dari sini )
berikut adalah contoh jsbin .
edit: dibersihkan dan diposting sebagai mksort.js di github .
sumber
Ini berguna untuk jenis alfa dari semua ukuran. Berikan indeks yang ingin Anda sortir, secara berurutan, sebagai argumen.
sumber
Saya sarankan untuk menggunakan pembanding dan rantai bawaan yang diinginkan dengan urutan logis atau
||
.Contoh kerja:
sumber
Anda dapat menggabungkan 2 variabel menjadi kunci sortir dan menggunakannya untuk perbandingan Anda.
sumber
Saya menemukan multisotr . Ini adalah pustaka sederhana, kuat, dan kecil untuk beberapa penyortiran. Saya perlu mengurutkan berbagai objek dengan kriteria pengurutan dinamika:
Perpustakaan ini lebih kuat, itulah kasus saya. Cobalah.
sumber
Saya sedang bekerja
ng-grid
dan perlu untuk menyortir beberapa kolom pada array catatan yang dikembalikan dari API, jadi saya datang dengan fungsi multi-sortir yang bagus dan dinamis ini.Pertama-tama,
ng-grid
aktifkan "peristiwa" untuk "ngGridSorted" dan meneruskan struktur ini kembali, yang menjelaskan jenisnya:Jadi saya membangun sebuah fungsi yang secara dinamis akan menghasilkan fungsi sortir berdasarkan
sortData
seperti yang ditunjukkan di atas ( Jangan takut dengan scroll bar! Panjangnya hanya sekitar 50 baris! Juga, saya minta maaf tentang slop. Ini mencegah horizontal scrollbar! ):Saya kemudian mengurutkan hasil API saya (
results
) seperti ini:Saya harap orang lain menikmati solusi ini seperti saya! Terima kasih!
sumber
Coba ini:
Tampilkan cuplikan kode
Saya berasumsi bahwa data Anda dalam array di
let t = [ [publicationID, publication_name, ownderID, owner_name ], ... ]
mana indeks owner_name = 3 dan publikasi_name = 1.sumber
Metode Penambahan String
Anda dapat mengurutkan berdasarkan beberapa nilai hanya dengan menambahkan nilai ke dalam string dan membandingkan string. Akan sangat membantu jika menambahkan karakter kunci terpisah untuk mencegah limpasan dari satu kunci ke kunci berikutnya.
Contoh
sumber
sumber
Saya mengalami masalah serupa saat menampilkan blok kumpulan memori dari output beberapa komposisi h-fungsi DOM virtual. Pada dasarnya saya menghadapi masalah yang sama seperti menyortir data multi-kriteria seperti hasil skor dari pemain di seluruh dunia.
Saya perhatikan bahwa pengurutan multi-kriteria adalah:
Dan jika Anda tidak peduli, Anda bisa gagal dengan cepat di neraka bersarang jika-lagi ... seperti janji neraka ...
Bagaimana jika kita menulis fungsi "predikat" untuk memutuskan bagian mana dari alternatif yang digunakan? Predikatnya sederhana:
Sekarang setelah menulis pengujian klasifikasi Anda (byCountrySize, byAge, byGameType, byScore, byLevel ...) apa pun yang dibutuhkan, Anda dapat memberi bobot pada pengujian Anda (1 = asc, -1 = desc, 0 = nonaktifkan), letakkan dalam array , dan terapkan fungsi pengurangan 'putuskan' seperti ini:
Dan voila! Terserah Anda untuk menentukan kriteria / bobot / pesanan Anda sendiri ... tetapi Anda mengerti. Semoga ini membantu !
EDIT: * pastikan bahwa ada total urutan penyortiran pada setiap kolom * perhatikan tidak adanya ketergantungan antar urutan kolom, dan tidak ada ketergantungan melingkar
jika, tidak, penyortiran bisa menjadi tidak stabil!
sumber
Perpustakaan saya sendiri untuk bekerja dengan ES6 iterables (blinq) memungkinkan (antara lain) penyortiran multi-level yang mudah
sumber
Bersumber dari GitHub
sumber
Saya baru saja menerbitkan ke npm perpustakaan mikro yang disebut sort-helper ( sumber di github ) . Idenya adalah mengimpor helper
by
untuk membuat fungsi perbandingan untuksort
metode array melalui sintaksitems.sort(by(column, ...otherColumns))
, dengan beberapa cara untuk mengekspresikan kolom yang akan diurutkan berdasarkan:persons.sort(by('lastName', 'firstName'))
,dates.sort(by(x => x.toISOString()))
,[3, 2, 4, 1].sort(by(desc(n => n)))
→[3, 2, 1, 0]
,['B', 'D', 'c', 'a'].sort(by(ignoreCase(x => x))).join('')
→'aBcD'
.Ini mirip dengan nice thenBy disebutkan dalam jawaban ini tetapi dengan perbedaan berikut yang mungkin lebih sesuai dengan selera beberapa:
thenBy
API fasih) ,sumber