تقنية

فرز أسماء الملفات المرقمة في JavaScript: كيف تضع 2 قبل 10؟

ترتيبان محسوبان للأسماء الستة عند تعطيل المقارنة الرقمية وتفعيلها.
مخرجات تجربتنا؛ يُقرأ كل عمود من أعلى إلى أسفل.

بحر العلوم · تقنية · البرمجة

لفرز أسماء تتضمن أرقاما، أنشئ Intl.Collator بخيار numeric مضبوط على true، ثم مرر دالة compare إلى الفرز. اختر اللغة المقصودة بدلا من الاعتماد على الإعداد الافتراضي. [1] [2]

الخلاصة السريعة

  • يغير numeric طريقة مقارنة المقاطع الرقمية داخل الأسماء. [1]
  • في تجربتنا تقدّم doc2.txt على doc10.txt بعد تفعيل الخيار.
  • اقرأ إشارة compare؛ لا تشترط أن يكون السالب مساويًا لناقص واحد. [2]
  • احتفظ بالسجلين حين تتعادل المقارنة ولا تتطابق الأسماء.

حدد قاعدة المقارنة قبل الفرز

تقارن sort() افتراضيا القيم بعد تحويلها إلى نصوص وفق وحدات UTF-16. أما المقارنة المخصصة فتحدد ترتيب العناصر من القيمة التي تعيدها الدالة. [3]

يتيح Intl.Collator تحديد اللغة وغرض الفرز، ويجعل numeric المقارنة الرقمية فعالة. لا نفترض أن ترتيب الحروف واحد في كل لغة. [1]

سنجرب أسماء مؤلفة لست وثائق، مكتوبة بحروف لاتينية وأرقام. اخترنا en لهذا المثال وحددنا غرض المقارنة بأنه فرز. المطلوب وضع الوثيقة ذات الرقم 2 قبل ذات الرقم 10، مع الاحتفاظ بكل اسم كما كتبناه؛ ليس المطلوب فتح الوثائق أو تغيير تسميتها.

القائمة نفسها تحت إعدادين

كتبنا قائمة الإدخال بهذا التسلسل: doc10.txt ثم doc02.txt ثم doc1.txt ثم doc20.txt ثم doc2.txt ثم doc3.txt. نفذنا الاختبار محليا في Node.js 24.19.0 وEdge 155.0.4283.45. اتفقت النتائج في هاتين البيئتين، وسجلنا الإعدادات الفعلية للمقارن مع المخرجات.

عند تعطيل numeric بدأ الناتج باسم doc02.txt، وتقدم doc10.txt على doc2.txt. وعند تفعيله جاء doc1.txt أولا، ثم الاسمان اللذان يحملان 02 و2، ثم doc3.txt، وبعدهما doc10.txt وdoc20.txt. لم نحذف أي اسم؛ تغيرت المواضع داخل القائمة فقط.

الجدول يتيح تتبع كل موضع بدلا من الاكتفاء بعبارة «صار الترتيب صحيحا». راجع مثلا الموضع الخامس: يحمل doc20.txt في عمود numeric=false وdoc10.txt في عمود numeric=true. ثم تحقق من أن الأسماء الستة نفسها موجودة مرة واحدة في كل عمود.

الموضعnumeric=falsenumeric=true
1doc02.txtdoc1.txt
2doc1.txtdoc02.txt
3doc10.txtdoc2.txt
4doc2.txtdoc3.txt
5doc20.txtdoc10.txt
6doc3.txtdoc20.txt

نفذ الفرز على نسخة من القائمة

تعدل sort() المصفوفة التي تستدعى عليها. ينشئ الانتشار داخل الأقواس نسخة سطحية قبل الفرز؛ يكفي ذلك لقائمة النصوص في هذا المثال. [3]

دالة compare مرتبطة بالمقارن، لذلك يمكن تمريرها مباشرة إلى sort(). [2]

الكود التالي يستخدم ترتيب الإدخال السابق. قارن سطر الناتج بعمود numeric=true في الجدول، ثم اطبع names أيضا إذا أردت رؤية بقاء الإدخال كما كان. تحققنا من هذا البقاء فعلا؛ لم نختبر هنا قائمة كائنات متداخلة أو نقس سرعة التنفيذ.

const names = [
  "doc10.txt", "doc02.txt", "doc1.txt",
  "doc20.txt", "doc2.txt", "doc3.txt"
];
const collator = new Intl.Collator("en", {
  usage: "sort", numeric: true
});
const result = [...names].sort(collator.compare);
console.log(result);

[1] [2] [3]

افحص الإشارة ثم افصل التعادل عن التطابق

تعني القيمة السالبة أن النص الأول يسبق الثاني، والموجبة أنه يأتي بعده، والصفر أنهما متعادلان وفق المقارن. المقدار الدقيق للقيمة غير الصفرية ليس عقدا ثابتا بين التطبيقات. [2]

في تجربتنا أعادت مقارنة doc2.txt مع doc10.txt قيمة سالبة. أما مقارنة doc02.txt مع doc2.txt فأعادت صفرا، في حين كانت مساواة النصين باستخدام === كاذبة. هنا تشير نتيجتان إلى سؤالين مختلفين: موقعهما بحسب المقارن، وتطابق السلسلتين حرفيا.

لذلك أبقينا السجلين في الناتج، ولم نستعمل الصفر أمرا لدمجهما. لو سمينا السجل الأول «بطاقة أ» والثاني «بطاقة ب» لبقي لدينا بطاقتان تحملان اسمين مختلفين. لا يوجد في تجربتنا فحص محتوى ملف يبرر إسقاط إحداهما، بل مجرد ستة نصوص في الذاكرة.

يحفظ الفرز المستقر ترتيب الإدخال النسبي للعناصر المتعادلة في المقارنة، كما توثق JavaScript منذ ECMAScript 2019. [3]

كان doc02.txt قبل doc2.txt في الإدخال الأول وبقي قبله في الناتج الرقمي. وفي اختبار إضافي مررنا هذين الاسمين فقط بترتيب معكوس؛ بقي doc2.txt أولا. لهذا لا نصف ظهور الصفر البادئ أولا بأنه قاعدة مستقلة تعلمناها من المثال.

اسمان مختلفان حرفيا أعادا صفرا في المقارنة الرقمية المحلية.
نتيجة المقارنة ومساواة النصين فحصان نفذناهما على الاسمين الظاهرين.

احفظ الاختبار مع قاعدة العرض

سجلنا الأسماء الأصلية، والخيار، واللغة، والتسلسل الناتج. اخترنا المقارنة الرقمية لأن هذا هو طلب القائمة التدريبية. لم ننشئ ملفات فعلية بهذه الأسماء، ولم ننقل شيئا على القرص، ولم نستنتج محتوى وثيقة من رقمها. المخرجات تخص النصوص الستة المذكورة والبيئتين اللتين شغلنا فيهما الكود.

عند إعداد قائمة أخرى، اكتب أولا ترتيبها المطلوب وأسباب اختيارك له. أضف حالة تعادل متعمدة كي ترى هل تريد إبقاء السجلين، وحدد ذلك في تصميم البيانات. ولا تحول المثال إلى محلل للتواريخ أو أرقام الإصدارات؛ لم نختبر أيا منهما هنا.

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي وراجعته أدوات ذكاء اصطناعي. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.