عكس المصفوفات في JavaScript: 5 طرق عملية مع أمثلة وشرح دقيق
مقدمة: لماذا يُعد عكس المصفوفة مهارة مهمة في JavaScript؟
يُعد عكس عناصر المصفوفة في JavaScript من المسائل الشائعة جداً في التمارين البرمجية، واختبارات التوظيف، والمقابلات التقنية. والسبب في ذلك أن هذه المسألة تقيس فهمك لأساسيات التعامل مع arrays، وآلية تعديل البيانات، والفرق بين إنشاء نسخة جديدة من المصفوفة أو التعديل على المصفوفة الأصلية نفسها.
في هذا الدليل، ستتعرف إلى خمس طرق فعّالة لعكس المصفوفة في JavaScript، سواء باستخدام الدالة reverse() أو بدونها، مع أمثلة واضحة تساعدك على اختيار الأسلوب الأنسب حسب حالتك العملية.

استخدام الدالة reverse() لعكس المصفوفة في JavaScript
إذا كنت تريد عكس ترتيب عناصر المصفوفة بسرعة، فيمكنك استخدام الدالة reverse(). هذه الدالة تجعل آخر عنصر في البداية، وأول عنصر في النهاية.
let numbers = [1, 2, 3, 4, 5];
let reversedNumbers = numbers.reverse();
console.log(reversedNumbers); // [5, 4, 3, 2, 1]
هذه الطريقة مباشرة وسهلة، لكنها تحمل نقطة مهمة يجب الانتباه لها: الدالة reverse() لا تُرجع فقط مصفوفة معكوسة، بل تقوم أيضاً بتعديل المصفوفة الأصلية نفسها.
let numbers = [1, 2, 3, 4, 5];
let reversedNumbers = numbers.reverse();
console.log(reversedNumbers); // [5, 4, 3, 2, 1]
console.log(numbers); // [5, 4, 3, 2, 1]
متى تكون reverse() مناسبة؟
- عندما لا تمانع تعديل المصفوفة الأصلية.
- عندما تحتاج إلى حل سريع ومختصر.
- عندما تكون كفاءة الكود ووضوحه أهم من الاحتفاظ بالنسخة الأصلية.
عكس المصفوفة دون تعديل الأصل باستخدام spread operator
في كثير من الحالات، ستحتاج إلى عكس عناصر المصفوفة مع الاحتفاظ بالمصفوفة الأصلية كما هي. هنا يمكنك استخدام spread operator مع reverse().
الفكرة ببساطة هي إنشاء نسخة جديدة من المصفوفة أولاً عبر الصياغة [...numbers]، ثم تطبيق reverse() على النسخة الجديدة بدلاً من الأصل.
let numbers = [1, 2, 3, 4, 5];
let reversedNumbers = [...numbers].reverse();
console.log(reversedNumbers); // [5, 4, 3, 2, 1]
console.log(numbers); // [1, 2, 3, 4, 5]
مزايا هذه الطريقة
- تحافظ على المصفوفة الأصلية دون أي تغيير.
- سهلة القراءة ومناسبة للمشاريع الحديثة.
- مفيدة عندما تتعامل مع أنماط برمجية تعتمد على عدم تعديل البيانات مباشرة.
ملاحظة مهمة حول التوافق
الصياغة spread operator تُعد من ميزات ES6. لذلك، إذا كنت تعمل في بيئة قديمة أو تحتاج إلى توافق أكبر مع متصفحات أقدم، فقد تكون الطريقة التالية أكثر ملاءمة.
استخدام slice() مع reverse() للحفاظ على المصفوفة الأصلية
يمكنك أيضاً إنشاء نسخة من المصفوفة باستخدام slice() بدون تمرير أي معاملات، ثم عكس هذه النسخة باستخدام reverse().
let numbers = [1, 2, 3, 4, 5];
let reversedNumbers = numbers.slice().reverse();
console.log(reversedNumbers); // [5, 4, 3, 2, 1]
console.log(numbers); // [1, 2, 3, 4, 5]
عند استدعاء slice() بهذا الشكل، يتم إنشاء مصفوفة جديدة مطابقة للأصل. وبعد ذلك، تُطبَّق reverse() على النسخة فقط، ولهذا لا تتأثر المصفوفة الأصلية.
متى تفضّل هذه الطريقة؟
- إذا كنت تريد أسلوباً واضحاً ومتوافقاً مع بيئات أقدم من
ES6. - إذا كنت تحتاج إلى تجنب تعديل المصفوفة الأصلية.
- إذا كنت تعمل على شيفرات قديمة تعتمد على أسلوب
ES5.
عكس المصفوفة بدون استخدام reverse()
في بعض المقابلات التقنية، قد يُطلب منك عكس مصفوفة من دون استخدام الدالة الجاهزة reverse(). الهدف هنا هو اختبار فهمك للمنطق البرمجي وليس مجرد معرفة الدوال المدمجة.
يمكن تنفيذ ذلك باستخدام حلقة for مع الدالة push() لإضافة العناصر إلى مصفوفة جديدة بترتيب عكسي.
let numbers = [1, 2, 3, 4, 5];
let reversedNumbers = [];
for (let i = numbers.length - 1; i >= 0; i--) {
reversedNumbers.push(numbers[i]);
}
console.log(reversedNumbers);
كيف تعمل هذه الفكرة؟
- نبدأ من آخر عنصر في المصفوفة باستخدام
numbers.length - 1. - نتحرك للخلف حتى نصل إلى أول عنصر.
- في كل دورة، نضيف العنصر الحالي إلى مصفوفة جديدة عبر
push().
النتيجة النهائية هي مصفوفة جديدة تحتوي على العناصر بترتيب معكوس، بينما تبقى المصفوفة الأصلية دون تغيير.
كتابة دالة مخصصة لعكس المصفوفة في مكانها
إذا طُلب منك إنشاء دالة خاصة بك لعكس المصفوفة دون إنشاء نسخة جديدة، فالحل يعتمد على تبديل العناصر من الطرفين باتجاه الوسط.
بمعنى آخر:
- بدّل أول عنصر مع آخر عنصر.
- ثم بدّل العنصر الثاني مع العنصر قبل الأخير.
- استمر بهذه الطريقة حتى تصل إلى منتصف المصفوفة.

الخطوة الأولى: تعريف الدالة وتحديد المؤشرين
سننشئ دالة باسم customReverse()، ثم نحدد مؤشراً لبداية المصفوفة ومؤشراً لنهايتها.
function customReverse(originalArray) {
let leftIndex = 0;
let rightIndex = originalArray.length - 1;
}
الخطوة الثانية: استخدام حلقة while لتبديل العناصر
طالما أن المؤشر الأيسر leftIndex أصغر من المؤشر الأيمن rightIndex، يمكننا الاستمرار في تبديل العناصر.
while (leftIndex < rightIndex) {
let temp = originalArray[leftIndex];
originalArray[leftIndex] = originalArray[rightIndex];
originalArray[rightIndex] = temp;
}
الخطوة الثالثة: تحريك المؤشرين نحو المنتصف
بعد كل عملية تبديل، نزيد قيمة leftIndex بمقدار واحد، وننقص قيمة rightIndex بمقدار واحد حتى تكتمل العملية.
function customReverse(originalArray) {
let leftIndex = 0;
let rightIndex = originalArray.length - 1;
while (leftIndex < rightIndex) {
let temp = originalArray[leftIndex];
originalArray[leftIndex] = originalArray[rightIndex];
originalArray[rightIndex] = temp;
leftIndex++;
rightIndex--;
}
}
اختبار الدالة عملياً
let myArray = [1, 2, 3, 4, 5];
customReverse(myArray);
console.log(myArray); // [5, 4, 3, 2, 1]
لماذا تتوقف الحلقة في الوقت المناسب؟
تتوقف الحلقة عندما لا يعود هناك عناصر تحتاج إلى التبديل:
- إذا كان عدد العناصر فردياً، فسيتساوى كل من
leftIndexوrightIndexعند الوصول إلى العنصر الأوسط، ولا حاجة لتبديله. - إذا كان عدد العناصر زوجياً، فسيتجاوز
leftIndexقيمةrightIndexبعد الانتهاء من جميع عمليات التبديل.
مقارنة سريعة بين طرق عكس المصفوفة
| الطريقة | هل تعدّل الأصل؟ | تنشئ نسخة جديدة؟ | مناسبة للمقابلات؟ |
|---|---|---|---|
reverse() |
نعم | لا | نعم، للحالات الأساسية |
[...array].reverse() |
لا | نعم | نعم |
slice().reverse() |
لا | نعم | نعم |
for مع push() |
لا | نعم | ممتازة |
customReverse() |
نعم | لا | ممتازة جداً |
أفضل طريقة لعكس المصفوفة: كيف تختار؟
اختيار الطريقة المناسبة يعتمد على الهدف من الكود:
- إذا كنت تريد حلاً سريعاً ومباشراً: استخدم
reverse(). - إذا كنت تريد الحفاظ على البيانات الأصلية: استخدم
[...array].reverse()أوslice().reverse(). - إذا كنت في مقابلة تقنية أو تمرين خوارزمي: استخدم حلقة
forأو أنشئ دالة مثلcustomReverse(). - إذا كنت تهتم بالتوافق مع الشيفرات القديمة: فطريقة
slice()مناسبة أكثر منspread operator.
الخلاصة التقنية
عكس المصفوفة في JavaScript ليس مجرد استخدام للدالة reverse()، بل هو مفهوم يرتبط بطريقة إدارة البيانات داخل البرنامج. إذا كنت تحتاج إلى السرعة والبساطة، فالدوال المدمجة تكفي تماماً. أما إذا كنت تريد فهماً أعمق أو تستعد لمقابلة عمل، فإن كتابة منطق العكس يدوياً تمنحك فهماً أفضل لكيفية عمل المصفوفات وتبديل العناصر بكفاءة. أفضل ممارسة هي أن تختار الحل بناءً على ما إذا كنت تريد تعديل المصفوفة الأصلية أم الحفاظ عليها.
ومع إتقان هذه الأساليب، ستكون أكثر قدرة على التعامل مع أسئلة JavaScript الشائعة وكتابة شيفرات أوضح وأكثر احترافية.
