منذ وقت ليس ببعيد ، جاءت مشكلة سحرية للغاية في رمز زميلي. تتمثل العملية الخشنة في فرز صفيف مكون من كائنات ، حيث يتم استخدام السمة A لفرز ، والسباحة B هي حالة مفضلة. عندما يساوي B 1 ، بغض النظر عن القيمة A ، يتم تصنيفها في البداية. هذه مشكلة بسيطة للغاية. المشكلة هي أنه يستخدم الفرز مرتين لتنفيذ الفرز هذه المرة ، والفرز أولاً وفقًا لسمة A ، ثم الفرز وفقًا لقيمة B. تكمن المشكلة في الفرز الثاني.
سنأخذ الأمر أمراً مفروغاً منه أنه في الفرز الأول ، تم فرز الصفيف من كبير إلى صغير وفقًا لسمات أ. في المرة الثانية ، لا نحتاج فقط إلى نقل ترتيب الصفيف الأصلي (عادةً ما يتم كتابته على أنه عودة 0 أو -1 في الطريقة) ، ونفكر فقط في ذكر العناصر ذات B تساوي 1 إلى الأمام. ولكن في الواقع ، يرتبط هذا بخوارزمية الفرز التي اختارتها اللغة. تستخدم طريقة الفرز المدمجة لـ JavaScript (واللغات الأخرى معًا) مجموعة من العديد من خوارزميات الفرز ، وأحيانًا لا يمكن أن تضمن أن موضع نفس العناصر لا يزال متسقًا.
أدناه مثال موجود من stackoverflow
نسخة الكود كما يلي:
var arraytosort = [
{name: 'a' ، القوة: 1} ، {name: 'b' ، القوة: 1} ، {name: 'c' ، القوة: 1} ، {name: 'd' ، القوة: 1} ،
{name: 'e' ، القوة: 1} ، {name: 'f' ، القوة: 1} ، {name: 'g' ، القوة: 1} ، {name: 'h' ، القوة: 1} ،
{name: 'i' ، القوة: 1} ، {name: 'j' ، القوة: 1} ، {name: 'k' ، القوة: 1} ، {name: 'l' ، القوة: 1} ،
{name: 'm' ، القوة: 1} ، {name: 'n' ، القوة: 1} ، {name: 'o' ، القوة: 1} ، {name: 'p' ، القوة: 1} ،
{name: 'q' ، القوة: 1} ، {name: 'r' ، القوة: 1} ، {name: 's' ، القوة: 1} ، {name: 't' ، القوة: 1}
] ؛
arraytosort.sort (وظيفة (أ ، ب) {
إرجاع B.Strength - A.Strength ؛
}) ؛
arraytosort.foreach (وظيفة (عنصر) {
console.log (element.name) ؛
}) ؛
نعتقد أن قيمة العنصر الأخير لا تزال من A إلى T ، ولكن النتيجة الفعلية غير مرتبة. وذلك لأن خوارزمية الفرز لا تحتفظ بترتيب الصفيف الأصلي ، أي غير مستقر.
ثم يجب أن نحاول تجنب هذا الموقف. في مثال زميلي ، يجب أن يكون دمج منطق نوعين في أحدهما طريقة ممكنة. إذا كان يجب تقسيمها إلى أنواع متعددة ، فسيتم تسجيل ترتيب الصفيف الأصلي على سمات العناصر.