Saya perlu mengurutkan objek JavaScript dengan kunci.
Maka berikut ini:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
Akan menjadi:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
javascript
sorting
vdh_ant
sumber
sumber
Object.entries
danObject.fromEntries
ditambahkan ke JS, ini dapat dicapai dengan one-liner pendek yang bagus:Object.fromEntries(Object.entries(obj).sort())
Jawaban:
Jawaban lain untuk pertanyaan ini sudah usang, realitas implementasi tidak pernah cocok, dan secara resmi menjadi tidak benar sekarang karena spesifikasi ES6 / ES2015 telah diterbitkan.
Lihat bagian tentang urutan iterasi properti di Menjelajahi ES6 oleh Axel Rauschmayer :
Jadi ya, objek JavaScript yang sebenarnya memerintahkan, dan urutan kunci mereka / sifat dapat diubah.
Inilah cara Anda bisa mengurutkan objek berdasarkan kunci / propertinya, menurut abjad:
Gunakan
var
alih-alihconst
untuk kompatibilitas dengan mesin ES5.sumber
Objek JavaScript 1 tidak dipesan. Tidak ada artinya mencoba "memilah" mereka. Jika Anda ingin mengulangi properti objek, Anda bisa mengurutkan kunci dan kemudian mengambil nilai terkait:
Implementasi alternatif menggunakan
Object.keys
fanciness:1 Tidak ingin bertele-tele, tetapi tidak ada objek JSON .
sumber
{"a", 1}
halnya JSON Array adalah istilah yang tepat untuk string seperti[1]
. Sangat berguna untuk dapat berkomunikasi dengan mengatakan hal-hal seperti objek ketiga dalam array saya ketika Anda memiliki string[{x: 1}, {y: 2}, {z: 3}]
, jadi saya lebih suka "Itu bukan objek JSON" ketika berkomentar tentang literal Javascript, alih-alih "Tidak ada hal sebagai objek JSON ", yang hanya akan menyebabkan lebih banyak kebingungan dan kesulitan komunikasi nanti ketika OP sebenarnya bekerja dengan JSON.{"a", 1}
dapat berupa objek literal atau teks JSON (alias string JSON, jika Anda lebih suka). Yang tergantung pada konteks, yang pertama jika muncul kata demi kata dalam kode sumber JavaScript, yang kedua jika itu adalah string yang perlu diteruskan ke parser JSON untuk digunakan lebih lanjut. Ada perbedaan nyata antara keduanya ketika menyangkut sintaks yang diizinkan, penggunaan yang benar, dan serialisasi.Banyak orang telah menyebutkan bahwa "objek tidak dapat diurutkan" , tetapi setelah itu mereka memberi Anda solusi yang berfungsi. Paradox, bukan?
Tidak ada yang menyebutkan mengapa solusi itu berhasil. Yaitu, karena di sebagian besar implementasi nilai-nilai browser dalam objek disimpan dalam urutan di mana mereka ditambahkan. Itu sebabnya jika Anda membuat objek baru dari daftar kunci yang disortir, itu mengembalikan hasil yang diharapkan.
Dan saya pikir kita bisa menambahkan satu lagi solusi - cara fungsional ES5:
Versi ES2015 di atas (diformat menjadi "satu-liner"):
Penjelasan singkat dari contoh di atas (seperti yang ditanyakan dalam komentar):
Object.keys
memberi kami daftar kunci pada objek yang disediakan (obj
atauo
), lalu kami menyortirnya menggunakan algoritma penyortiran default, selanjutnya.reduce
digunakan untuk mengubah array itu kembali menjadi objek, tapi kali ini dengan semua kunci yang diurutkan.sumber
for...in
).Object.keys(dict).sort().reduce((r, k) => Object.assign(r, { [k]: dict[k] }), {});
Teman-teman saya secara kiasan terkejut! Tentu semua jawaban agak lama, tetapi tidak ada yang menyebutkan stabilitas dalam penyortiran! Jadi bersabarlah, saya akan mencoba yang terbaik untuk menjawab pertanyaan itu sendiri dan pergi ke detail di sini. Jadi saya akan minta maaf sekarang akan banyak dibaca.
Karena ini tahun 2018 saya hanya akan menggunakan ES6, semua Polyfill tersedia di dokumen MDN, yang akan saya tautkan pada bagian yang diberikan.
Jawab pertanyaan:
Jika kunci Anda hanya angka maka Anda dapat dengan aman menggunakannya
Object.keys()
bersamaArray.prototype.reduce()
untuk mengembalikan objek yang diurutkan:Namun jika Anda bekerja dengan string, saya sangat menyarankan untuk merantai
Array.prototype.sort()
semua ini:Jika seseorang bertanya-tanya pengurangan apa yang terjadi:
Jika diperlukan di sini adalah penjelasan untuk liner:
Mengapa Penyortiran agak rumit:
Singkatnya
Object.keys()
akan mengembalikan array dengan urutan yang sama seperti yang kita dapatkan dengan loop normal:Sidenote - Anda dapat menggunakan
Object.keys()
pada array juga, perlu diingat indeks akan dikembalikan:Tapi itu tidak semudah yang ditunjukkan oleh contoh-contoh itu, objek dunia nyata dapat berisi angka dan karakter alfabet atau bahkan simbol (tolong jangan lakukan itu).
Ini adalah contoh dengan semuanya dalam satu objek:
Sekarang jika kita gunakan
Array.prototype.sort()
pada array di atas perubahan output:Berikut ini kutipan dari dokumen:
Anda harus memastikan bahwa salah satu dari mereka mengembalikan output yang diinginkan untuk Anda. Dalam contoh nyata, orang cenderung mencampuradukkan hal-hal secara khusus jika Anda menggunakan input informasi yang berbeda seperti API dan Database secara bersamaan.
Jadi apa masalahnya?
Ada dua artikel yang harus dipahami oleh setiap programmer:
Algoritma di tempat :
Jadi pada dasarnya array lama kita akan ditimpa! Ini penting jika Anda ingin menyimpan array lama karena alasan lain. Jadi ingatlah ini.
Algoritma penyortiran
Ini menunjukkan bahwa penyortirannya benar tetapi itu berubah. Jadi di dunia nyata bahkan jika penyortirannya benar kita harus memastikan bahwa kita mendapatkan apa yang kita harapkan! Ini sangat penting mengingat hal ini juga. Untuk contoh JavaScript lainnya, lihat Array.prototype.sort () - docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
sumber
Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {})
.{5: 'hearts'}
atau{5: 'spades'}
dan Anda mulai mengurutkan susunan kartu itu akan berpotensi tidak stabil dalam permainan seperti rummy. Belum lagi bahasa yang berbeda.Ini bekerja untuk saya
sumber
Ini tahun 2019 dan kami memiliki cara 2019 untuk menyelesaikan ini :)
sumber
di sini adalah 1 liner
sumber
(o[k] = v, o)
. Mengapa ini bekerja, di mana saya dapat menemukan dokumen tentangnya? Jelas mengembalikan parameter paling kanan, tetapi mengapa?o[k]
sama denganv
dan kemudian kembalio
Ini adalah pertanyaan lama, tetapi mengambil isyarat dari jawaban Mathias Bynens ', saya telah membuat versi pendek untuk mengurutkan objek saat ini , tanpa banyak overhead.
setelah eksekusi kode, objek "tidak berurutan" itu sendiri akan memiliki kunci yang diurutkan berdasarkan abjad.
sumber
Menggunakan lodash ini akan bekerja:
Hanya makanan untuk dipikirkan.
sumber
Misalkan itu bisa berguna dalam VisualStudio debugger yang menunjukkan properti objek yang tidak terurut.
sumber
Versi garis bawah :
Jika Anda tidak mempercayai peramban Anda untuk menjaga urutan kunci, saya sangat menyarankan untuk mengandalkan array array berpasangan dengan nilai kunci.
sumber
_.object(_.sortBy(_.pairs(unordered), _.first))
sumber
Mungkin bentuk yang sedikit lebih elegan:
PS dan sama dengan sintaks ES6 +:
sumber
pengurutan rekursif, untuk objek dan array bersarang
sumber
else
di sana - bisa benar untuk keduanyaArray.isArray(obj[key])
dan untuktypeof obj[key] === 'object'
function sortObjectKeys(obj){
::if(typeof obj != 'object'){ /* it is a primitive: number/string (in an array) */ return obj; }
. Untuk ketahanan saya pada awal lengkap juga menambahkan:if(obj == null || obj == undefined){ return obj; }
Seperti yang telah disebutkan, objek tidak berurutan.
Namun...
Anda mungkin menemukan idiom ini berguna:
Anda kemudian dapat beralih melalui kv dan melakukan apapun yang Anda inginkan.
sumber
Berikut ini adalah versi berbasis Lodash bersih yang berfungsi dengan objek bersarang
Akan lebih bersih jika lodash memiliki
toObject()
metode ...sumber
Cukup gunakan lodash untuk unzip peta dan urutkan oleh nilai pertama pasangan dan zip lagi itu akan mengembalikan kunci yang diurutkan.
Jika Anda ingin nilai pengubahan nilai indeks pasangan menjadi 1, bukan 0
sumber
Mengurutkan kunci secara rekursif sambil mempertahankan referensi.
Contoh:
sumber
delete o[e[0]];
sana? Tidak bisakah kita menetapkan saja?sumber
Ini adalah solusi ringan untuk semua yang saya butuhkan untuk menyortir JSON.
sumber
Gunakan kode ini jika Anda memiliki objek bersarang atau jika Anda memiliki objek array bersarang.
sumber
Larutan:
Penjelasan:
Banyak runtimes JavaScript menyimpan nilai di dalam objek sesuai urutan penambahannya.
Untuk mengurutkan properti suatu objek dengan kunci mereka, Anda dapat menggunakan fungsi Object.keys yang akan mengembalikan array kunci. Array kunci kemudian dapat diurutkan berdasarkan Array.prototype.sort () yang mengurutkan elemen-elemen array di tempat (tidak perlu menempatkan mereka ke variabel baru).
Setelah tombol diurutkan, Anda dapat mulai menggunakannya satu per satu untuk mengakses konten objek lama untuk mengisi objek baru (yang sekarang disortir).
Di bawah ini adalah contoh prosedur (Anda dapat mengujinya di browser yang ditargetkan):
Catatan: Object.keys adalah metode ECMAScript 5.1 tetapi di sini ada polyfill untuk peramban yang lebih lama:
sumber
Saya mentransfer beberapa enum Java ke objek javascript.
Objek-objek ini mengembalikan array yang benar untuk saya. jika kunci objek adalah tipe campuran (string, int, char), ada masalah.
Tampilkan cuplikan kode
sumber
Cuplikan sederhana dan mudah dibaca, menggunakan lodash.
Anda harus memasukkan kunci dalam tanda kutip hanya saat memanggil sortBy. Itu tidak harus dalam tanda kutip dalam data itu sendiri.
Juga, parameter kedua Anda untuk memetakan salah. Seharusnya fungsi, tetapi menggunakan memetik lebih mudah.
sumber
Ada proyek hebat oleh @sindresorhus yang disebut sort-keys yang bekerja dengan sangat baik.
Anda dapat memeriksa kode sumbernya di sini:
https://github.com/sindresorhus/sort-keys
Atau Anda dapat menggunakannya dengan npm:
Berikut juga contoh kode dari readme-nya
sumber
JavaScript murni menjawab untuk mengurutkan Objek. Ini adalah satu-satunya jawaban yang saya tahu yang akan menangani angka negatif. Fungsi ini untuk menyortir Objek numerik.
Input obj = {1000: {}, -1200: {}, 10000: {}, 200: {}};
Output akan menjadi objek yang diurutkan berdasarkan angka-angka itu dengan kunci baru mulai dari 0.
sumber
Hanya untuk menyederhanakannya dan membuatnya lebih jelas jawaban dari Matt Ball
sumber
Tidak yakin apakah ini menjawab pertanyaan, tetapi inilah yang saya butuhkan.
Disebut sebagai:
sumber
Satu baris:
sumber
cara terbaik untuk melakukannya adalah
Pertama-tama Anda dapat mengonversi objek yang hampir mirip array menjadi array nyata, dan kemudian menggunakan .reverse ():
Slot kosong di bagian akhir jika disebabkan karena indeks pertama Anda adalah 1 bukan 0. Anda dapat menghapus slot kosong dengan .length-- atau .pop ().
Atau, jika Anda ingin meminjam .reverse dan menyebutnya pada objek yang sama, itu harus objek yang sepenuhnya seperti array. Artinya, perlu properti panjang:
Catatan itu akan mengembalikan objek objek yang sepenuhnya seperti array, sehingga tidak akan menjadi array nyata. Anda kemudian dapat menggunakan delete untuk menghapus properti panjang.
sumber