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()
bersama Array.prototype.reduce()
untuk mengembalikan objek yang diurutkan:
// Only numbers to show it will be sorted.
const testObj = {
'2000': 'Articel1',
'4000': 'Articel2',
'1000': 'Articel3',
'3000': 'Articel4',
};
// I'll explain what reduces does after the answer.
console.log(Object.keys(testObj).reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* '1000': 'Articel3',
* '2000': 'Articel1',
* '3000': 'Articel4',
* '4000': 'Articel2'
* }
*/
// if needed here is the one liner:
console.log(Object.keys(testObj).reduce((a, c) => (a[c] = testObj[c], a), {}));
Namun jika Anda bekerja dengan string, saya sangat menyarankan untuk merantai Array.prototype.sort()
semua ini:
// String example
const testObj = {
'a1d78eg8fdg387fg38': 'Articel1',
'z12989dh89h31d9h39': 'Articel2',
'f1203391dhj32189h2': 'Articel3',
'b10939hd83f9032003': 'Articel4',
};
// Chained sort into all of this.
console.log(Object.keys(testObj).sort().reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* a1d78eg8fdg387fg38: 'Articel1',
* b10939hd83f9032003: 'Articel4',
* f1203391dhj32189h2: 'Articel3',
* z12989dh89h31d9h39: 'Articel2'
* }
*/
// again the one liner:
console.log(Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {}));
Jika seseorang bertanya-tanya pengurangan apa yang terjadi:
// Will return Keys of object as an array (sorted if only numbers or single strings like a,b,c).
Object.keys(testObj)
// Chaining reduce to the returned array from Object.keys().
// Array.prototype.reduce() takes one callback
// (and another param look at the last line) and passes 4 arguments to it:
// accumulator, currentValue, currentIndex and array
.reduce((accumulator, currentValue) => {
// setting the accumulator (sorted new object) with the actual property from old (unsorted) object.
accumulator[currentValue] = testObj[currentValue];
// returning the newly sorted object for the next element in array.
return accumulator;
// the empty object {} ist the initial value for Array.prototype.reduce().
}, {});
Jika diperlukan di sini adalah penjelasan untuk liner:
Object.keys(testObj).reduce(
// Arrow function as callback parameter.
(a, c) =>
// parenthesis return! so we can safe the return and write only (..., a);
(a[c] = testObj[c], a)
// initial value for reduce.
,{}
);
Mengapa Penyortiran agak rumit:
Singkatnya Object.keys()
akan mengembalikan array dengan urutan yang sama seperti yang kita dapatkan dengan loop normal:
const object1 = {
a: 'somestring',
b: 42,
c: false
};
console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]
Object.keys () mengembalikan array yang elemen-elemennya adalah string yang bersesuaian dengan properti enumerable yang ditemukan langsung pada objek. Urutan properti adalah sama dengan yang diberikan dengan mengulangi properti objek secara manual.
Sidenote - Anda dapat menggunakan Object.keys()
pada array juga, perlu diingat indeks akan dikembalikan:
// simple array
const arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
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:
// This is just to show what happens, please don't use symbols in keys.
const testObj = {
'1asc': '4444',
1000: 'a',
b: '1231',
'#01010101010': 'asd',
2: 'c'
};
console.log(Object.keys(testObj));
// output: [ '2', '1000', '1asc', 'b', '#01010101010' ]
Sekarang jika kita gunakan Array.prototype.sort()
pada array di atas perubahan output:
console.log(Object.keys(testObj).sort());
// output: [ '#01010101010', '1000', '1asc', '2', 'b' ]
Berikut ini kutipan dari dokumen:
Metode sort () mengurutkan elemen-elemen dari array di tempat dan mengembalikan array. Semacam ini belum tentu stabil. Urutan penyortiran default adalah sesuai dengan poin kode Unicode string.
Kompleksitas waktu dan ruang dari jenis tidak dapat dijamin karena tergantung implementasi.
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 :
Dalam ilmu komputer, algoritma in-place adalah algoritma yang mengubah input tanpa menggunakan struktur data tambahan. Namun sejumlah kecil ruang penyimpanan tambahan diizinkan untuk variabel tambahan. Input biasanya ditimpa oleh output saat algoritma dijalankan. Algoritma in-place memperbarui urutan input hanya melalui penggantian atau pertukaran elemen. Algoritma yang tidak di tempat kadang-kadang disebut tidak di tempat atau di luar 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
Algoritma sortir yang stabil mengurutkan elemen identik dalam urutan yang sama dengan yang muncul pada input. Saat mengurutkan beberapa jenis data, hanya sebagian dari data yang diperiksa saat menentukan urutan pengurutan. Misalnya, dalam contoh penyortiran kartu di sebelah kanan, kartu disortir berdasarkan pangkatnya, dan setelannya diabaikan. Ini memungkinkan beberapa versi berbeda yang diurutkan dengan benar dari daftar asli. Algoritma sorting yang stabil memilih salah satu dari ini, sesuai dengan aturan berikut: jika dua item membandingkan sama, seperti dua 5 kartu, maka urutan relatif mereka akan dipertahankan, sehingga jika satu datang sebelum yang lain dalam input, itu juga akan datang sebelum yang lain di output.
Contoh stabil pada kartu remi. Ketika kartu diurutkan berdasarkan peringkat dengan pengurutan yang stabil, kedua 5s harus tetap dalam urutan yang sama dalam output yang diurutkan di mana mereka awalnya masuk. Ketika mereka diurutkan dengan pengurutan yang tidak stabil, 5s mungkin berakhir sebaliknya. memesan dalam output yang diurutkan.
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