Saya memiliki array objek dengan beberapa pasangan nilai kunci, dan saya perlu mengurutkannya berdasarkan 'updated_at':
[
{
"updated_at" : "2012-01-01T06:25:24Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-09T11:25:13Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-05T04:13:24Z",
"foo" : "bar"
}
]
Apa cara paling efisien untuk melakukannya?
javascript
arrays
object
monster kue
sumber
sumber
Jawaban:
Anda bisa menggunakannya
Array.sort
.Ini sebuah contoh:
sumber
keyA - keyB
(atau mungkinkeyB - keyA
)? Objek tanggal memilikivalueOf()
metode.a-b
sangat penting jika Anda ingin menghindari kode panjang. Sementara kode panjang tidak selalu buruk dalam hal ini saya pikir verbositas membuatnya lebih sulit untuk dipahami. Saat ini saya menggunakanvalues.sort((a,b)=>a.attr-b.attr)
. Harus menulis 5 baris setiap kali Anda perlu mengurutkan array menjadi membosankan.Saya sudah menjawab pertanyaan yang sangat mirip di sini: Fungsi sederhana untuk mengurutkan berbagai objek
Untuk pertanyaan itu saya membuat fungsi kecil ini yang mungkin melakukan apa yang Anda inginkan:
sumber
-1
:)array = array.reverse()
fungsinya.Metode Array.sort () mengurutkan elemen array di tempat dan mengembalikan array. Hati-hati dengan Array.sort () karena tidak dapat diubah . Untuk sortir immutable gunakan immutable-sort .
Metode ini adalah mengurutkan array menggunakan arus Anda
updated_at
dalam format ISO. Kami menggunakannew Data(iso_string).getTime()
untuk mengubah waktu ISO ke cap waktu Unix. Stempel waktu Unix adalah angka yang bisa kita gunakan matematika sederhana. Kami kurangi cap waktu pertama dan kedua hasilnya adalah; jika stempel waktu pertama lebih besar dari yang kedua, angka pengembaliannya akan positif. Jika angka kedua lebih besar dari yang pertama nilai pengembaliannya akan negatif. Jika keduanya sama, pengembaliannya akan nol. Ini alines sempurna dengan nilai pengembalian yang diperlukan untuk fungsi inline.Untuk ES6 :
Untuk ES5 :
Jika Anda mengubah
updated_at
menjadi cap waktu unix, Anda dapat melakukan ini:Untuk ES6 :
Untuk ES5 :
Pada saat posting ini, browser modern tidak mendukung ES6. Untuk menggunakan ES6 di browser modern, gunakan babel untuk mengubah kode menjadi ES5. Harapkan dukungan browser untuk ES6 dalam waktu dekat.
Array.sort () harus menerima nilai pengembalian salah satu dari 3 hasil yang mungkin:
Untuk jenis Immutable: (contoh dalam ES6)
Anda juga dapat menulis seperti ini:
Impor-dari yang Anda lihat adalah cara baru untuk memasukkan javascript di ES6 dan membuat kode Anda terlihat sangat bersih. Favorit pribadi saya.
Sortir yang tidak berubah tidak mengubah array sumber, melainkan mengembalikan array baru. Menggunakan
const
dianjurkan pada data berubah.sumber
Berikut ini adalah versi @David Brainer-Banker yang sedikit dimodifikasi yang mengurutkan secara abjad berdasarkan string, atau secara numerik dengan angka, dan memastikan bahwa kata-kata yang dimulai dengan huruf kapital tidak mengurutkan kata-kata di atas dimulai dengan huruf kecil (misalnya "apel, awal" akan ditampilkan dalam urutan itu).
sumber
Gunakan garis bawah js atau lodash,
_.sortBy()
mengembalikan array barulihat http://underscorejs.org/#sortBy dan lodash docs https://lodash.com/docs#sortBy
sumber
Dengan dukungan ES2015 dapat dilakukan dengan:
sumber
new Date(iso_str).getTime()
ini akan mengembalikan cap waktu Unix.Data Diimpor
UNTUK pesanan naik
Contoh untuk Asc Order
UNTUK pesanan menurun
Contoh untuk Desc Order
sumber
Seperti ini menyatakan jawaban ini, Anda dapat menggunakan
Array.sort
.arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)})
sumber
Hanya cara lain yang lebih matematis dalam melakukan hal yang sama tetapi lebih pendek :
atau dengan gaya panah lambda yang apik:
Metode ini dapat dilakukan dengan input numerik apa pun
sumber
Sedangkan untuk hari ini, jawaban @knowbody ( https://stackoverflow.com/a/42418963/6778546 ) dan @Rocket Hazmat ( https://stackoverflow.com/a/8837511/6778546 ) dapat dikombinasikan untuk menyediakan dukungan ES2015 dan penanganan tanggal yang benar:
sumber
Saya telah membuat fungsi penyortiran dalam naskah yang dapat kita gunakan untuk mencari string, tanggal dan angka dalam array objek. Itu juga dapat mengurutkan pada beberapa bidang.
Pemakaian:
sumber
Menyortir menurut tanggal yang diformat ISO bisa mahal, kecuali jika Anda membatasi klien untuk browser terbaru dan terbaik, yang dapat membuat cap waktu yang benar dengan Date-parsing the string.
Jika Anda yakin dengan input Anda, dan Anda tahu itu akan selalu yyyy-mm-ddThh: mm: ss dan GMT (Z) Anda dapat mengekstraksi digit dari setiap anggota dan membandingkannya seperti bilangan bulat
Jika tanggal dapat diformat secara berbeda, Anda mungkin perlu menambahkan sesuatu untuk orang-orang dengan tantangan iso:
sumber
Date.parse
?Untuk kelengkapan di sini adalah implementasi generik pendek yang mungkin dari sortBy:
Perhatikan bahwa ini menggunakan metode susunan array yang mengurutkan di tempat. untuk salinan Anda dapat menggunakan arr.concat () atau arr.slice (0) atau metode serupa untuk membuat salinan.
sumber
Dengan ini kita bisa melewati fungsi kunci yang digunakan untuk menyortir
Lalu misalnya kalau sudah
Kita bisa
atau
atau
sumber
Anda bisa menggunakan pustaka utilitas Lodash untuk menyelesaikan masalah ini (pustaka yang cukup efisien):
Anda dapat menemukan dokumentasi di sini: https://lodash.com/docs/4.17.15#orderBy
sumber
Anda dapat membuat penutupan dan mengopernya seperti itu di sini adalah contoh saya yang berfungsi
sumber
sumber
Array.sort()
untuk mengurutkan array…
) untuk membuat fungsinya murniupdated_at
)Array.sort()
bekerja dengan mengurangi dua properti dari item saat ini dan berikutnya jika itu adalah nomor / objek di mana Anda dapat melakukan operasi aritmiasumber
Saya menghadapi hal yang sama, jadi saya menangani ini dengan alasan umum dan saya membangun fungsi untuk ini:
sumber