Perkenalan
Dalam sistem informasi yang berpusat pada data, ini adalah cara umum untuk menampilkan data dalam bentuk tabel. Menyortir data adalah fitur penting. Sortir dapat dibagi menjadi penyortiran berdasarkan bidang tunggal dan menyortir dengan berbagai arah penyortiran dari beberapa bidang. Penyortiran lapangan tunggal sangat terbatas dan tidak dapat memenuhi kebutuhan pengguna untuk perubahan masalah data. Penyortiran multi-lapangan dapat menebus cacat ini dengan lebih baik.
Penyortiran multi-lapangan, metode implementasi dapat dibagi menjadi implementasi back-end dan implementasi front-end dari tingkat yang besar.
Penyortiran backend
Penyortiran implementasi back-end dapat diimplementasikan di tingkat database atau di tingkat aplikasi.
Sangat mudah untuk mengimplementasikan penyortiran multi-lapangan di tingkat database. Cukup gunakan perintah penyortiran SQL "order by" - order by field1 asc, field2 desc, field3 asc - ....
Tingkat aplikasi mengacu pada lapisan aplikasi web (arsitektur C/S tidak dibahas di sini), seperti PHP, Java Web, ASP.NET, dll. Implementasi tingkat aplikasi adalah menggunakan bahasa layanan back-end seperti PHP, Java, dan .NET (C#/VB) untuk mengurutkan data. Mengambil ASP.NET C# sebagai contoh, karena LINQ di C# memiliki operasi bawaan pada jenis koleksi dan mendukung penyortiran multi-atribut, menggunakan LINQ dapat dengan mudah mencapai tujuan ini-dari F dalam fos orderby f.name yang turun, f.num yang sedang Pilih F (dapat ditemukan bahwa sintaks semacam linq hampir persis sama dengan SQL). Jika bahasa lain tidak memiliki dukungan serupa, mereka diimplementasikan sesuai dengan algoritma penyortiran, yang umum dan tidak ada hubungannya dengan bahasa pemrograman.
Penyortiran front-end
Dalam JavaScript, array memiliki metode penyortiran "sort". Ketika array adalah array sederhana (elemen array adalah tipe sederhana - string, nilai dan boolean), metode ini dapat digunakan untuk dengan mudah mencapai tujuan penyortiran. Namun, ketika elemen array adalah tipe non-sederhana, seperti objek dari pasangan nama/nilai, dan Anda ingin mengurutkannya dalam arah penyortiran yang berbeda sesuai dengan atribut yang ditentukan, panggilan sederhana ke metode "sortir" tidak dapat mencapai ini.
Untungnya, metode "sortir" memesan antarmuka penyortiran khusus, yang dapat mengimplementasikan metode penyortiran yang diinginkan.
Mari kita lihat seperti apa metode "sortir" array.
Urutkan Fungsi Prototipe
// Urutkan elemen array di tempat dan kembalikan array ini. // Secara default, urutkan berdasarkan titik kode unicode dari string. Array.prototype.sort ([CompareFunction]: number); // Nomor: -1 | 0 | 1. // Fungsi perbandingan yang khas (Urutan menaik yang diurutkan). function compareFunction (item1, item2) {if (item1> item2) {return 1; // Jika diurutkan dalam urutan menurun, kembalikan -1. } else if (item1 === item2) {return 0;} else {return -1; // Jika diurutkan dalam urutan menurun, kembalikan 1.}}Catatan: Jika perbandingan tidak ditentukan, elemen dikonversi menjadi karakter string dan diurutkan dalam urutan bit unicode. Misalnya, "ceri" akan diatur sebelum "pisang". Saat menyortir angka, 9 akan muncul sebelum 80 karena mereka akan dikonversi menjadi string terlebih dahulu, dan "80" di depan "9".
• Jika perbandingan fungsi (a, b) kurang dari 0, maka A akan diatur sebelum b;
• Jika perbandingan fungsi (a, b) sama dengan 0, a dan b
Posisi relatif tetap tidak berubah. Catatan: Standar ECMASCRIPT tidak menjamin perilaku ini, dan tidak semua browser akan mematuhi itu (misalnya, Mozilla pada tahun 2003
versi sebelum 2019);
• Jika perbandingan fungsi (a, b) lebih besar dari 0, b akan diatur sebelum a.
• Perbandingan fungsi (a, b) harus selalu mengembalikan hasil perbandingan yang sama ke input yang sama, jika tidak hasil yang diurutkan tidak pasti.
Catatan: Hasil penyortiran yang diperoleh dengan aturan di atas adalah dalam urutan naik. Jika Anda ingin mendapatkan hasil yang menurun, Anda akan mengembalikan hasil kurang dari 0 ketika hasil perbandingan lebih besar dari 0. Jika hasil perbandingan kurang dari 0, Anda dapat mengembalikan hasil lebih besar dari 0.
Untuk mengimplementasikan penyortiran multi-atribut, kuncinya adalah membandingkan implementasi fungsi. Menurut aturan di atas, pemesanan beberapa atribut dalam arah yang berbeda diimplementasikan, dan hubungan ukuran antara dua item perbandingan masih dikembalikan.
Jadi bagaimana menentukan ukuran hubungan banyak objek atribut? Ini bisa dilakukan dalam dua langkah.
Langkah pertama adalah mencatat hasil yang diperoleh dengan membandingkan dua item penyortiran sesuai dengan atribut dan arah penyortiran mereka.
var proporder = {"prop1": "asc", "prop2": "desc", "prop3": "asc"}; fungsi cmp (item1, item2, proporder) {var cps = []; // Digunakan untuk merekam hasil perbandingan dari setiap atribut penyortiran, -1 | 0 | 1. var isasc = true; // Urutkan arah. untuk (var p dalam proporder) {isasc = proporder [p] === "ASC"; if (item1 [p]> item2 [p]) {cps.push (ISASC? 1: -1); break; // Anda dapat melompat keluar dari loop, karena di sini Anda sudah tahu bahwa item1 "lebih besar dari item2". } else if (item1 [p] === item2 [p]) {cps.push (0);} else {cps.push (isasc? -1: 1); break; // Anda dapat melompat keluar dari loop, item1 "kurang dari" item2. }} /*...*/}Langkah kedua adalah secara komprehensif menilai hubungan ukuran akhir dari dua istilah perbandingan berdasarkan hasil perbandingan dari setiap atribut penyortiran.
/ * ... */untuk (var j = 0; j <cps.length; j ++) {if (cps [j] === 1 || cps [j] === -1) {return cps [j];}} return 0;Dengan ide di atas, mudah untuk mengimplementasikan seluruh fungsi perbandingan. Berikut adalah kode JavaScript lengkap untuk fungsi perbandingan:
Fungsi perbandingan
function sortByprops (item1, item2) {"Gunakan ketat"; var props = []; untuk (var _i = 2; _i <arguments.length; _i ++) {props [_i - 2] = argumen [_i];} var cps = []; // Simpan hasil perbandingan atribut penyortiran. // Jika atribut penyortiran tidak ditentukan, urutkan dalam urutan naik semua atribut. var asc = true; if (props.length <1) {for (var p dalam item1) {if (item1 [p]> item2 [p]) {cps.push (1); break; // Jika lebih besar dari, loop akan pecah. } else if (item1 [p] === item2 [p]) {cps.push (0);} else {cps.push (-1); break; // Jika kurang dari, loop akan melompat keluar. }}} else {for (var i = 0; i <props.length; i ++) {var prop = props [i]; untuk (var o di prop) {asc = prop [o] === "ASC"; if (item1 [o]> item2 [o]) {cps.push (ASC? 1: -1); break; // Jika lebih besar dari, loop akan pecah. } else if (item1 [o] === item2 [o]) {cps.push (0);} else {cps.push (ASC? -1: 1); break; // Jika kurang dari, loop akan melompat keluar. }}}} untuk (var j = 0; j <cps.length; j ++) {if (cps [j] === 1 || cps [j] === -1) {return cps [j];}} return 0; }Kasus uji
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- proporder);}); console.log (item);} function testasc () {test ({"name": "asc", "value": "asc"});} function testdesc () {test ({"name": "desc", "value": "desc"});} function function () {"name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", "name", " });} function testdescasc () {test ({"name": "desc", "value": "asc"});} kode naskah/**** Arah sortir. */type Direct = "ASC" | "desc";/**** Sortir. ** ** @Interface iPropertyOrder*/Interface iPropertyOrder {[Name: String]: Direct;}/**** Nama Sederhana/Nilai Objek. ** ** @Interface isImpleObject*/antarmuka isImpleObject {[name: string]: string | Nomor | boolean;}/**** Sortir objek nama/nilai sederhana sesuai dengan atribut yang ditentukan dan arah penyortiran (sesuai dengan atribut penyortiran dan arah penyortiran, ** membandingkan dua item secara bergantian dan mengembalikan nilai yang mewakili posisi penyortiran). ** ** @template t objek nama/nilai sederhana. ** @param {t} item1 sortir item perbandingan 1. ** @param {t} item2 sortir berdasarkan perbandingan item 2. ** @param {... iPropertyOrder []} properti Sort Props. ** @returns Jika item 1 lebih besar dari item 2, return 1, jika item 1 sama dengan item 2, return 0, jika tidak kembali -1. */function sortbyprops <t extends isImpleObject> (item1: t, item2: t, ... props: iPropertyOrder []) {"Gunakan ketat"; var cps: array <number> = []; // Menyimpan hasil perbandingan atribut penyortiran. // Jika atribut penyortiran tidak ditentukan, urutkan dalam urutan naik semua atribut. var asc = true; if (props.length <1) {for (var p dalam item1) {if (item1 [p]> item2 [p]) {cps.push (1); break; // Jika lebih besar dari, loop akan pecah. } else if (item1 [p] === item2 [p]) {cps.push (0);} else {cps.push (-1); break; // Jika kurang dari, loop akan melompat keluar. }}} else {// urutkan berdasarkan atribut tertentu dan arah pengangkatan. untuk (var i = 0; i <props.length; i ++) {var prop = props [i]; untuk (var o dalam prop) {asc = prop [o] === "ASC"; if (item1 [o]> item2 [o]) {cps.push (ASC? 1: -1); break; // Jika lebih besar dari, loop akan pecah. } else if (item1 [o] === item2 [o]) {cps.push (0);} else {cps.push (ASC? -1: 1); break; // Jika kurang dari, loop akan melompat keluar. }}}} untuk (var j = 0; j <cps.length; j ++) {if (cps [j] === 1 || cps [j] === -1) {return cps [j];}} return 0; }Gunakan skenario dan keterbatasan
Menggunakan JavaScript untuk mengimplementasikan penyortiran multi-atribut di ujung depan mengurangi permintaan ke sisi server dan mengurangi tekanan komputasi di sisi server, tetapi hanya cocok untuk situasi di mana hanya data lokal yang perlu diurutkan. Jika Anda perlu mengurutkan seluruh dataset di beberapa atribut, pada akhirnya akan dilakukan di tingkat basis data sisi server.
Di atas adalah deskripsi lengkap tentang bagaimana array objek JavaScript diurutkan berdasarkan atribut yang ditentukan dan arah penyortiran yang diperkenalkan oleh editor kepada Anda. Saya harap mereka akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!