مقدمة
في أنظمة المعلومات التي تركز على البيانات ، إنها طريقة شائعة لعرض البيانات في شكل جدولي. فرز البيانات هو ميزة أساسية. يمكن تقسيم الفرز إلى الفرز بواسطة حقل واحد وفرز عن طريق فرز مختلف لحقول متعددة. يعد فرز المجال الواحد محدودًا للغاية ولا يمكنه تلبية احتياجات المستخدم للتغييرات في مخاوف البيانات. يمكن للفرز متعدد الحقول تعويضًا أفضل لهذا العيب.
الفرز متعدد المجالات ، يمكن تقسيم طريقة التنفيذ إلى تنفيذ الواجهة الخلفية وتنفيذ الواجهة الأمامية من مستوى كبير.
فرز الخلفية
يمكن تنفيذ فرز التنفيذ الخلفي على مستوى قاعدة البيانات أو على مستوى التطبيق.
من السهل جدًا تنفيذ فرز متعدد الحقول على مستوى قاعدة البيانات. ما عليك سوى استخدام أمر فرز SQL "Order by" - Order by Field1 ASC ، Field2 DESC ، Field3 ASC - ....
يشير مستوى التطبيق إلى طبقة تطبيق الويب (لا تتم مناقشة بنية C/S هنا) ، مثل PHP و Java Web و ASP.NET ، إلخ. أخذ ASP.NET C# كمثال ، نظرًا لأن LINQ في C# لديه عمليات مدمجة على أنواع التجميع ويدعم فرزًا متعدد الجوزات ، يمكن أن يؤدي استخدام LINQ بسهولة إلى تحقيق هذا الهدف-من F في FOS Orderby F.NAME DENCENGENT ، F.NUM ضمانة SELECT F (يمكن العثور على أن نوع SORTAX من LINQ هو نفسه تقريبًا مثل SQL). إذا لم يكن لدى اللغات الأخرى دعمًا مشابهًا مدمجًا ، فسيتم تنفيذها وفقًا لفرز خوارزميات ، وهو أمر عام وليس له أي علاقة بلغات البرمجة.
فرز الواجهة الأمامية
في JavaScript ، تحتوي المصفوفات على طريقة فرز "الفرز". عندما تكون الصفيف عبارة عن مجموعة بسيطة (عناصر الصفيف هي أنواع بسيطة - الأوتار والقيم والملاءات المنطقية) ، يمكن استخدام هذه الطريقة لتحقيق غرض الفرز بسهولة. ومع ذلك ، عندما يكون عنصر المصفوفة نوعًا غير بسيط ، مثل كائن من زوج/قيمة ، وتريد فرزه في اتجاهات فرز مختلفة وفقًا للسمات المحددة ، لا يمكن لدعوة بسيطة إلى طريقة "الفرز" تحقيق ذلك.
لحسن الحظ ، تحتفظ طريقة "الفرز" بواجهة فرز مخصصة ، والتي يمكنها تنفيذ طريقة الفرز المطلوبة.
دعونا نرى كيف تبدو طريقة "الفرز" في الصفيف.
فرز النموذج الأولي للوظيفة
// فرز عناصر الصفيف في مكانها وإرجاع هذه الصفيف. // بشكل افتراضي ، فرز نقطة رمز Unicode للسلسلة. Array.Prototype.sort ([comparefunction]: Number) ؛ // الرقم: -1 | 0 | 1. // وظيفة المقارنة النموذجية (ترتيب تصاعدي مرتبة). دالة comparefunction (item1 ، item2) {if (item1> item2) {return 1 ؛ // إذا تم فرزها بترتيب تنازلي ، فالتراجع -1. } if if (item1 === item2) {return 0 ؛} else {return -1 ؛ // إذا تم فرزها بترتيب تنازلي ، فأعود 1.}}ملاحظة: إذا لم يتم تحديد comparefunction ، يتم تحويل العناصر إلى أحرف من السلسلة وفرزها بترتيب بت Unicode. على سبيل المثال ، سيتم ترتيب "الكرز" قبل "الموز". عند فرز الأرقام ، ستظهر 9 قبل 80 عامًا لأنه سيتم تحويلها إلى سلاسل أولاً ، و "80" قبل "9".
• إذا كان CompareFunction (A ، B) أقل من 0 ، فسيتم ترتيب A قبل B ؛
• إذا كان CompareFunction (A ، B) يساوي 0 ، A و B.
الموقف النسبي لا يزال دون تغيير. ملاحظة: لا تضمن معايير ECMASCRIPT هذا السلوك ، ولن يلتزم جميع المتصفحات به (على سبيل المثال ، Mozilla في عام 2003
الإصدارات قبل 2019) ؛
• إذا كان CompareFunction (A ، B) أكبر من 0 ، فسيتم ترتيب B قبل A.
• يجب أن تعيد CompareFunction (A ، B) دائمًا نفس نتيجة المقارنة إلى نفس المدخلات ، وإلا فإن النتيجة المرتبة ستكون غير مؤكدة.
ملاحظة: نتائج الفرز التي تم الحصول عليها بواسطة القواعد المذكورة أعلاه هي في ترتيب تصاعدي. إذا كنت ترغب في الحصول على نتيجة تنازلية ، فستقوم بإرجاع نتيجة أقل من 0 عندما تكون نتيجة المقارنة أكبر من 0. إذا كانت نتيجة المقارنة أقل من 0 ، فيمكنك إرجاع نتيجة أكبر من 0.
لتنفيذ الفرز متعدد الجوزات ، المفتاح هو مقارنة تنفيذ الوظائف. وفقًا للقواعد المذكورة أعلاه ، يتم تنفيذ ترتيب سمات متعددة في اتجاهات مختلفة ، ولا يزال يتم إرجاع علاقة الحجم بين عناصر المقارنة.
إذن كيف تحدد علاقة حجم العديد من كائنات السمات؟ يمكن القيام بذلك في خطوتين.
الخطوة الأولى هي تسجيل النتائج التي تم الحصول عليها من خلال مقارنة عنصرين للفرز وفقًا لسمات الفرز والاتجاهات.
var proporders = {"prop1": "asc" ، "prop2": "desc" ، "prop3": "asc"} ؛ function cmp (item1 ، item2 ، proporders) {var cps = [] ؛ // تستخدم لتسجيل نتائج المقارنة لكل سمة فرز ، -1 | 0 | 1. var isasc = صحيح ؛ // فرز الاتجاه. لـ (var p في proporders) {iSasc = proporders [p] === "asc" ؛ if (item1 [p]> item2 [p]) {cps.push (isasc؟ 1: -1) ؛ break ؛ // يمكنك القفز من الحلقة ، لأنك تعرف هنا بالفعل أن Item1 "أكبر من Item2". } آخر إذا (item1 [p] ==== item2 [p]) {cps.push (0) ؛} else {cps.push (isasc؟ -1: 1) ؛ break ؛ // يمكنك القفز من الحلقة ، البند 1 "أقل من" item2. }} /*...*/}والخطوة الثانية هي الحكم بشكل شامل على علاقة الحجم النهائي لمصطلح المقارنة استنادًا إلى نتائج المقارنة لكل سمة فرز.
/ * ... */for (var j = 0 ؛ j <cps.length ؛ j ++) {if (cps [j] === 1 || cps [j] === -1) {return cps [j] ؛}} return 0 ؛مع الفكرة أعلاه ، من السهل تنفيذ وظيفة المقارنة بأكملها. فيما يلي رمز JavaScript الكامل لوظيفة المقارنة:
وظيفة المقارنة
الوظيفة sortByProps (item1 ، item2) {"use strict" ؛ var props = [] ؛ for (var _i = 2 ؛ _i <endress. // تخزين نتائج مقارنة سمة الفرز. // إذا لم يتم تحديد سمة الفرز ، فقم بفرزها بترتيب تصاعدي لجميع السمات. var asc = true ؛ if (props.length <1) {for (var p in item1) {if (item1 [p]> item2 [p]) {cps.push (1) ؛ break ؛ // إذا كان أكبر من ، فسوف تندلع الحلقة. } آخر إذا (item1 [p] ==== item2 [p]) {cps.push (0) ؛} else {cps.push (-1) ؛ break ؛ // إذا كان أقل من ، فإن الحلقة سوف تقفز. }}} else {for (var i = 0 ؛ i <props.length ؛ i ++) {var props = i] ؛ for (var o in 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 ++) {if (cps [j] === 1 || cps [j] === -1) {return cps [j] ؛}} return 0 ؛ }حالات الاختبار
// ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- proporders) ؛}) ؛ console.log (عناصر) ؛} وظيفة testasc () {test ({"name": "asc" ، "value": }) ؛} وظيفة testDescasc () {test ({"name": "desc" ، "value": "ASC"}) ؛} code code/**** فرز الفرز. */type direct = "asc" | "desc" ؛/**** سمة الفرز. ** ** interface ipropertyorder*/interface ipropertyorder {[name: string]: direct ؛}/**** كائن اسم/قيمة بسيط. ** ** interface isimpleObject*/interface isimpleObject {[name: string]: String | رقم | Boolean ؛}/**** فرز كائنات الاسم/القيمة البسيطة وفقًا للسمة المحددة واتجاه الفرز المحدد (وفقًا لسمة الفرز واتجاه الفرز ، يقارن ** العنصرين بدوره ويعيد القيمة التي تمثل موضع الفرز). ** ** template t كائن/قيمة بسيطة. ** param {t} item1 فرز العنصر المقارنة 1. ** param {t} item2 فرز بواسطة العنصر المقارنة 2. ** param {... iPropertyorder []} Props Sort Property. ** RETURNS إذا كان البند 1 أكبر من البند 2 ، إرجاع 1 ، إذا كان البند 1 مساوياً للبند 2 ، إرجاع 0 ، وإلا إلى -1. */function sortbyprops <t يمتد isimpleObject> (العنصر 1: t ، item2: t ، ... الدعائم: iPropertyOrder []) {"استخدم صارم" ؛ var cps: Array <mumber> = [] ؛ // يخزن نتائج مقارنة سمة الفرز. // إذا لم يتم تحديد سمة الفرز ، فقم بفرزها بترتيب تصاعدي لجميع السمات. var asc = true ؛ if (props.length <1) {for (var p in item1) {if (item1 [p]> item2 [p]) {cps.push (1) ؛ break ؛ // إذا كان أكبر من ، فسوف تندلع الحلقة. } آخر إذا (item1 [p] ==== item2 [p]) {cps.push (0) ؛} else {cps.push (-1) ؛ break ؛ // إذا كان أقل من ، فإن الحلقة سوف تقفز. }}} آخر {// الفرز بواسطة سمات محددة واتجاهات الرفع. لـ (var i = 0 ؛ i <props.length ؛ i ++) {var props = props [i] ؛ for (var o in prop) {asc = prop [o] === "asc" ؛ if (item1 [o]> item2 [o]) {cps.push (asc؟ 1: -1) ؛ break ؛ // إذا كان أكبر من ، فسوف تندلع الحلقة. } آخر إذا (item1 [o] ==== item2 [o]) {cps.push (0) ؛} else {cps.push (asc؟ -1: 1) ؛ break ؛ // إذا كان أقل من ، فإن الحلقة سوف تقفز. }}}} لـ (var j = 0 ؛ j <cps.length ؛ j ++) {if (cps [j] === 1 || cps [j] === -1) {return cps [j] ؛}} return 0 ؛ }استخدم السيناريوهات والقيود
إن استخدام JavaScript لتنفيذ فرز متعدد الجوانب على الواجهة الأمامية يقلل من الطلبات إلى جانب الخادم ويقلل من ضغط الحوسبة على جانب الخادم ، ولكنه مناسب فقط للمواقف التي يجب فيها فرز البيانات المحلية فقط. إذا كنت بحاجة إلى فرز مجموعة البيانات بأكملها في سمات متعددة ، فسيتم ذلك في النهاية على مستوى قاعدة البيانات من جانب الخادم.
ما سبق هو الوصف الكامل لكيفية فرز صفائف كائن JavaScript من خلال السمات المحددة واتجاهات الفرز التي قدمها لك المحرر. آمل أن يكونوا مفيدين لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!