การแนะนำ
ในระบบข้อมูลที่เน้นข้อมูลเป็นหลักเป็นวิธีทั่วไปในการแสดงข้อมูลในรูปแบบตาราง การเรียงลำดับข้อมูลเป็นคุณสมบัติที่สำคัญ การเรียงลำดับสามารถแบ่งออกเป็นการเรียงลำดับโดยฟิลด์เดี่ยวและเรียงลำดับโดยทิศทางการเรียงลำดับที่แตกต่างกันของหลายฟิลด์ การเรียงลำดับแบบฟิลด์เดียวมีข้อ จำกัด สูงและไม่สามารถตอบสนองความต้องการของผู้ใช้สำหรับการเปลี่ยนแปลงของข้อกังวลเกี่ยวกับข้อมูล การเรียงลำดับแบบหลายฟิลด์สามารถทำขึ้นได้ดีขึ้นสำหรับข้อบกพร่องนี้
การเรียงลำดับแบบหลายฟิลด์วิธีการใช้งานสามารถแบ่งออกเป็นการนำไปใช้แบ็คเอนด์และการใช้งานส่วนหน้าจากระดับใหญ่
การจัดเรียงแบ็กเอนด์
การจัดเรียงการใช้งานแบ็คเอนด์สามารถนำไปใช้ในระดับฐานข้อมูลหรือในระดับแอปพลิเคชัน
มันง่ายมากที่จะใช้การเรียงลำดับแบบหลายฟิลด์ที่ระดับฐานข้อมูล เพียงใช้คำสั่ง SQL Sorting "Order by" - สั่งซื้อโดย Field1 ASC, Field2 DESC, Field3 ASC - ....
ระดับแอปพลิเคชันหมายถึงเลเยอร์แอปพลิเคชันเว็บ (สถาปัตยกรรม C/S ไม่ได้กล่าวถึงที่นี่) เช่น PHP, Java Web, ASP.NET ฯลฯ การใช้งานระดับแอปพลิเคชันคือการใช้ภาษาบริการแบ็คเอนด์เช่น PHP, Java และ. NET (C#/VB) การใช้ ASP.NET C# เป็นตัวอย่างเนื่องจาก LINQ ใน C# มีการดำเนินการในตัวในประเภทคอลเลกชันและรองรับการเรียงลำดับแบบหลายแอตทริบิวต์การใช้ LINQ สามารถบรรลุเป้าหมายนี้ได้อย่างง่ายดาย-จาก F ใน fos order by f.name ลดลง f.num select f (สามารถพบได้ หากภาษาอื่นไม่มีการสนับสนุนที่คล้ายกันในตัวพวกเขาจะถูกนำไปใช้ตามอัลกอริทึมการเรียงลำดับซึ่งเป็นเรื่องทั่วไปและไม่มีส่วนเกี่ยวข้องกับภาษาการเขียนโปรแกรม
การเรียงลำดับส่วนหน้า
ในจาวาสคริปต์อาร์เรย์มีวิธีการเรียงลำดับ "เรียงลำดับ" เมื่ออาร์เรย์เป็นอาร์เรย์ที่เรียบง่าย (องค์ประกอบอาร์เรย์เป็นประเภทง่าย ๆ - สตริงค่าและบูลีน) วิธีนี้สามารถใช้เพื่อให้บรรลุวัตถุประสงค์ในการเรียงลำดับได้อย่างง่ายดาย อย่างไรก็ตามเมื่อองค์ประกอบอาร์เรย์เป็นประเภทที่ไม่ง่ายเช่นวัตถุของคู่ชื่อ/ค่าและคุณต้องการเรียงลำดับในทิศทางการเรียงลำดับที่แตกต่างกันตามแอตทริบิวต์ที่ระบุการเรียกวิธี "เรียงลำดับ" อย่างง่าย
โชคดีที่วิธีการ "เรียงลำดับ" ขอสงวนอินเทอร์เฟซการเรียงลำดับที่กำหนดเองซึ่งสามารถใช้วิธีการเรียงลำดับที่ต้องการ
มาดูกันว่าวิธีการ "เรียงลำดับ" ของอาร์เรย์เป็นอย่างไร
เรียงลำดับต้นแบบฟังก์ชัน
// จัดเรียงองค์ประกอบของอาร์เรย์ในสถานที่และส่งคืนอาร์เรย์นี้ // โดยค่าเริ่มต้นจัดเรียงตามจุดรหัส Unicode ของสตริง array.prototype.sort ([CompareFunction]: หมายเลข); // หมายเลข: -1 | 0 | 1. // ฟังก์ชั่นการเปรียบเทียบทั่วไป (เรียงลำดับจากน้อยไปมาก) ฟังก์ชั่น CompareFunction (item1, item2) {if (item1> item2) {return 1; // หากเรียงลำดับตามลำดับจากมากไปน้อยส่งคืน -1 } else if (item1 === item2) {return 0;} else {return -1; // ถ้าเรียงลำดับตามลำดับจากมากไปน้อยส่งคืน 1.}}หมายเหตุ: หากไม่ได้ระบุ CompareFunction องค์ประกอบจะถูกแปลงเป็นอักขระของสตริงและเรียงลำดับในลำดับบิต Unicode ตัวอย่างเช่น "เชอร์รี่" จะจัดก่อน "กล้วย" เมื่อเรียงลำดับหมายเลข 9 จะปรากฏขึ้นก่อน 80 เพราะพวกเขาจะถูกแปลงเป็นสตริงก่อนและ "80" อยู่ข้างหน้า "9"
•หาก CompareFunction (a, b) น้อยกว่า 0 ดังนั้น A จะถูกจัดเรียงก่อน B;
•หากเปรียบเทียบฟังก์ชั่น (a, b) เท่ากับ 0, a และ b
ตำแหน่งสัมพัทธ์ยังคงไม่เปลี่ยนแปลง หมายเหตุ: มาตรฐาน ECMASCRIPT ไม่รับประกันพฤติกรรมนี้และเบราว์เซอร์ทั้งหมดจะไม่ปฏิบัติตาม (ตัวอย่างเช่น Mozilla ในปี 2003
รุ่นก่อนปี 2019);
•หาก CompareFunction (A, B) มากกว่า 0, B จะจัดก่อน
• CompareFunction (a, b) จะต้องส่งคืนผลการเปรียบเทียบเดียวกันกับอินพุตเดียวกันเสมอมิฉะนั้นผลลัพธ์ที่เรียงลำดับจะไม่แน่นอน
หมายเหตุ: ผลลัพธ์การเรียงลำดับที่ได้รับจากกฎข้างต้นอยู่ในลำดับจากน้อยไปหามาก หากคุณต้องการได้ผลลัพธ์จากมากไปน้อยคุณจะส่งคืนผลลัพธ์ที่น้อยกว่า 0 เมื่อผลการเปรียบเทียบมากกว่า 0 ถ้าผลการเปรียบเทียบน้อยกว่า 0 คุณสามารถส่งคืนผลลัพธ์ที่มากกว่า 0
ในการใช้การเรียงลำดับแบบหลายแอตทริบิวต์กุญแจสำคัญคือการเปรียบเทียบการใช้งานฟังก์ชั่น ตามกฎข้างต้นการสั่งซื้อคุณลักษณะหลายอย่างในทิศทางที่แตกต่างกันจะถูกนำไปใช้และความสัมพันธ์ขนาดระหว่างรายการเปรียบเทียบทั้งสองยังคงถูกส่งกลับ
ดังนั้นจะกำหนดความสัมพันธ์ขนาดของวัตถุแอตทริบิวต์ได้อย่างไร? สามารถทำได้ในสองขั้นตอน
ขั้นตอนแรกคือการบันทึกผลลัพธ์ที่ได้จากการเปรียบเทียบรายการการเรียงลำดับสองรายการตามคุณสมบัติการเรียงลำดับและทิศทางของพวกเขา
var proporders = {"prop1": "asc", "prop2": "desc", "prop3": "asc"}; ฟังก์ชั่น cmp (item1, item2, proporders) {var cps = []; // ใช้เพื่อบันทึกผลการเปรียบเทียบของแต่ละแอตทริบิวต์การเรียงลำดับ -1 | 0 | 1. var isasc = true; // เรียงลำดับทิศทาง สำหรับ (var p ใน proporders) {isasc = proporders [p] === "asc"; ถ้า (item1 [p]> item2 [p]) {cps.push (isasc? 1: -1); break; // คุณสามารถกระโดดออกจากลูปได้เพราะที่นี่คุณรู้อยู่แล้วว่ารายการ 1 นั้น "มากกว่ารายการ 2" } อื่นถ้า (item1 [p] === item2 [p]) {cps.push (0);} else {cps.push (isasc? -1: 1); break; // คุณสามารถกระโดดออกจากลูปรายการ 1 "น้อยกว่า" รายการ 2 -ขั้นตอนที่สองคือการตัดสินความสัมพันธ์ขนาดสุดท้ายของคำเปรียบเทียบทั้งสองตามผลการเปรียบเทียบของแต่ละแอตทริบิวต์การเรียงลำดับ
/ * ... */for (var j = 0; j <cps.length; j ++) {ถ้า (cps [j] === 1 || cps [j] === -1) {return cps [j];}} return 0;ด้วยแนวคิดข้างต้นมันเป็นเรื่องง่ายที่จะใช้ฟังก์ชั่นการเปรียบเทียบทั้งหมด นี่คือรหัส JavaScript ที่สมบูรณ์สำหรับฟังก์ชั่นการเปรียบเทียบ:
ฟังก์ชันเปรียบเทียบ
ฟังก์ชั่น sortByProps (item1, item2) {"ใช้เข้มงวด"; var props = []; สำหรับ (var _i = 2; _i <arguments.length; _i ++) {props [_i - 2] = อาร์กิวเมนต์ [_i];} var cps = []; // จัดเก็บผลลัพธ์ของการเปรียบเทียบแอตทริบิวต์การเรียงลำดับ // หากไม่ได้ระบุแอตทริบิวต์การเรียงลำดับให้เรียงลำดับตามลำดับจากน้อยไปมากของแอตทริบิวต์ทั้งหมด var asc = true; if (props.length <1) {สำหรับ (var p ในรายการ 1) {ถ้า (item1 [p]> item2 [p]) {cps.push (1); break; // ถ้ายิ่งใหญ่กว่าลูปจะแตกออก } อื่นถ้า (item1 [p] === item2 [p]) {cps.push (0);} else {cps.push (-1); break; // ถ้ามันน้อยกว่าลูปจะกระโดดออกมา }}} else {สำหรับ (var i = 0; i <props.length; i ++) {var prop = props [i]; สำหรับ (var o ใน prop) {asc = prop [o] === "asc"; if (item1 [o]> item2 [o]) {cps.push (asc? 1: -1); // ถ้ายิ่งใหญ่กว่าลูปจะแตกออก } อื่นถ้า (item1 [o] === item2 [o]) {cps.push (0);} else {cps.push (asc? -1: 1); break; // ถ้ามันน้อยกว่าลูปจะกระโดดออกมา }}}} สำหรับ (var j = 0; j <cps.length; j ++) {ถ้า (cps [j] === 1 || cps [j] === -1) {return cps [j];}} return 0; -กรณีทดสอบ
- - - proporders);}); console.log (รายการ);} ฟังก์ชั่น testasc () {ทดสอบ ({":" asc "," value ":" asc "});} ฟังก์ชัน testdesc () {test ({" ชื่อ ":" desc "," value ":" desc "}; });} function testDescasc () {ทดสอบ ({"ชื่อ": "desc", "value": "asc"});} code typescript/**** ทิศทางการเรียงลำดับ */type direct = "asc" | "desc";/**** เรียงลำดับแอตทริบิวต์ ** ** @Interface iProperTyOrder*/อินเตอร์เฟส iProperTyOrder {[ชื่อ: สตริง]: โดยตรง;}/**** วัตถุชื่อ/ค่าง่าย ๆ ** ** @Interface isimpleObject*/อินเตอร์เฟส isimpleObject {[ชื่อ: สตริง]: สตริง | หมายเลข | บูลีน;}/**** เรียงลำดับวัตถุชื่อ/ค่าง่ายตามแอตทริบิวต์ที่ระบุและทิศทางการเรียงลำดับ (ตามทิศทางการเรียงลำดับและทิศทางการเรียงลำดับ ** เปรียบเทียบสองรายการในทางกลับกันและส่งคืนค่าที่แสดงตำแหน่งการเรียงลำดับ) ** ** @Template T ชื่อชื่อ/ค่าง่าย ๆ ** @param {t} รายการ 1 รายการการเปรียบเทียบรายการ 1. ** @param {t} รายการ 2 เรียงลำดับโดยการเปรียบเทียบรายการ 2. ** @param {... iPropertyorder []} คุณสมบัติการเรียงลำดับอุปกรณ์ประกอบฉาก ** @returns ถ้ารายการ 1 มากกว่ารายการ 2, return 1 ถ้ารายการ 1 เท่ากับรายการ 2, return 0, return -1 */ฟังก์ชั่น sortByProps <t ขยาย isimpleObject> (item1: t, item2: t, ... อุปกรณ์ประกอบฉาก: iPropertyorder []) {"ใช้เข้มงวด"; var cps: array <umber> = []; // เก็บผลลัพธ์ของการเปรียบเทียบแอตทริบิวต์การเรียงลำดับ // หากไม่ได้ระบุแอตทริบิวต์การเรียงลำดับให้เรียงลำดับตามลำดับจากน้อยไปมากของแอตทริบิวต์ทั้งหมด var asc = true; if (props.length <1) {สำหรับ (var p ในรายการ 1) {ถ้า (item1 [p]> item2 [p]) {cps.push (1); break; // ถ้ายิ่งใหญ่กว่าลูปจะแตกออก } อื่นถ้า (item1 [p] === item2 [p]) {cps.push (0);} else {cps.push (-1); break; // ถ้ามันน้อยกว่าลูปจะกระโดดออกมา }}} else {// เรียงลำดับตามแอตทริบิวต์ที่ระบุและทิศทางการยก สำหรับ (var i = 0; i <props.length; i ++) {var prop = props [i]; สำหรับ (var o in prop) {asc = prop [o] === "asc"; ถ้า (item1 [o]> item2 [o]) {cps.push (asc? 1: -1); // ถ้ายิ่งใหญ่กว่าลูปจะแตกออก } อื่นถ้า (item1 [o] === item2 [o]) {cps.push (0);} else {cps.push (asc? -1: 1); break; // ถ้ามันน้อยกว่าลูปจะกระโดดออกมา }}}} สำหรับ (var j = 0; j <cps.length; j ++) {ถ้า (cps [j] === 1 || cps [j] === -1) {return cps [j];}} return 0; -ใช้สถานการณ์และข้อ จำกัด
การใช้ JavaScript เพื่อใช้การเรียงลำดับแบบหลายแอตทริบิวต์ที่ปลายด้านหน้าช่วยลดการร้องขอไปยังฝั่งเซิร์ฟเวอร์และลดแรงกดดันจากการคำนวณทางฝั่งเซิร์ฟเวอร์ แต่เหมาะสำหรับสถานการณ์ที่ต้องจัดเรียงข้อมูลในท้องถิ่นเท่านั้น หากคุณต้องการเรียงลำดับชุดข้อมูลทั้งหมดในหลาย ๆ แอตทริบิวต์ในที่สุดมันจะทำในระดับฐานข้อมูลฝั่งเซิร์ฟเวอร์
ข้างต้นเป็นคำอธิบายแบบเต็มว่าอาร์เรย์วัตถุ JavaScript ถูกจัดเรียงตามแอตทริบิวต์ที่ระบุและทิศทางการเรียงลำดับที่ตัวแก้ไขแนะนำให้คุณรู้จัก ฉันหวังว่าพวกเขาจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!