Destructuring arrays

في JavaScript، Destructuring تعني “تفكيك” المصفوفات (أو الكائنات) إلى متغيرات فردية بطريقة مختصرة وسهلة القراءة.

✅ الفكرة العامة:

تخيل أنك تملك مصفوفة وتريد استخراج عناصرها في متغيرات مستقلة، بدل استخدام array[0], array[1]، يمكنك استخدام Destructuring.

✅ لماذا نستخدم Destructuring؟
  • ** لكتابة كود أقل وأنظف
  • ** لتسهيل قراءة البيانات والوصول إليها
  • ** لإنشاء دوال مرنة وقابلة لإعادة الاستخدام
  • ** لتفكيك استجابات واجهات البرمجة (APIs) أو القيم المُعادة من الدوال بسهولة
  • ** لاستخراج أجزاء محددة من المصفوفات أو الكائنات دون الحاجة إلى الفهارس اليدوية

🧠 الصيغة العامة:

const [var1, var2, var3] = array;
JavaScript
🟢 أمثلة على Destructuring Arrays
1. الأساسيات:
const colors = ['red', 'green', 'blue'];

const [firstColor, secondColor, thirdColor] = colors;

console.log(firstColor); // red
console.log(secondColor); // green
console.log(thirdColor); // blue
JavaScript
const numbers = [10, 20];
const [a, b] = numbers;
console.log(a); // 10
console.log(b); // 20
JavaScript
const colors = ['red', 'green', 'blue'];
const [first, second] = colors;
console.log(first);  // red
console.log(second); // green
JavaScript
const userData = ['Yasin', 'Programmer', 'Egypt'];

const [name, job, country] = userData;

console.log(`Name: ${name}, Job: ${job}, Country: ${country}`);
JavaScript

2- تخطي عناصر في المصفوفة:

const numbers = [1, 2, 3, 4];

const [first, , third] = numbers;

console.log(first); // 1
console.log(third); // 3
JavaScript
const letters = ['A', 'B', 'C', 'D'];
const [, , , last] = letters;
console.log(last); // D
JavaScript

3- استخدام قيمة افتراضية (Default Value):

const fruits = ['apple'];

const [firstFruit, secondFruit = 'banana'] = fruits;

console.log(firstFruit);  // apple
console.log(secondFruit); // banana (لأنه لم يتم تحديد عنصر ثاني)
JavaScript
const [a = 5, b = 10] = [undefined];
console.log(a); // 5
console.log(b); // 10
JavaScript
const [x = 'default', y = 'fallback'] = ['real'];
console.log(x); // real
console.log(y); // fallback
JavaScript

4- التبديل بين متغيرين باستخدام Destructuring:

let a = 10;
let b = 20;

[a, b] = [b, a];

console.log(a); // 20
console.log(b); // 10
JavaScript
let a = 1, b = 2;
[a, b] = [b, a];
console.log(a); // 2
console.log(b); // 1
JavaScript
let x = 'left', y = 'right';
[x, y] = [y, x];
console.log(x); // right
console.log(y); // left
JavaScript

5- استخدام Rest Operator لجمع باقي العناصر:

const names = ['Ali', 'Omar', 'Sami', 'Yasin'];

const [first, ...rest] = names;

console.log(first); // Ali
console.log(rest);  // ['Omar', 'Sami', 'Yasin']
JavaScript
🔍 هذا يسمى:

Direct destructuring assignment
أو التفكيك المباشر من قيمة فورية (inline value)

🧠 لماذا نستخدم التفكيك بدون اسم أحيانًا؟

لأننا:

  • لا نحتاج إلى المصفوفة الأصلية.
  • نريد فقط التقاط بعض العناصر منها بشكل مباشر.
  • نوفر سطر كود إضافي.
const [first, ...rest] = [1, 2, 3, 4];
console.log(first); // 1
console.log(rest);  // [2, 3, 4]
JavaScript
const [lang1, lang2, ...otherLangs] = ['HTML', 'CSS', 'JS', 'PHP', 'Python'];
console.log(otherLangs); // ['JS', 'PHP', 'Python']
JavaScript
💡 استخدامات عملية:
  • تخطي بعض العناصر الأولى في قائمة.
  • فصل عنصر رئيسي عن باقي القائمة.
  • معالجة أول عنصر بشكل خاص والباقي بشكل جماعي.

6- Destructuring داخل دالة:

function printNames(arr) {
  const first = arr[0];
  const second = arr[1];
  console.log(first, second);
}

//////////////////////

function printNames([first, second]) {
  console.log('First:', first);
  console.log('Second:', second);
}

printNames(['Ahmed', 'Sara']);
JavaScript
const [first, ...rest] = [1, 2, 3, 4];
console.log(first); // 1
console.log(rest);  // [2, 3, 4]
JavaScript
const [lang1, lang2, ...otherLangs] = ['HTML', 'CSS', 'JS', 'PHP', 'Python'];
console.log(otherLangs); // ['JS', 'PHP', 'Python']
JavaScript

7- استخدام Destructuring مع التكرار:

✨ لماذا التفكيك مهم في الحلقات؟
  • يبسط قراءة البيانات المكررة.
  • يتفادى استخدام الفهارس مثل arr[i][0].
  • يوضح نية المطوّر ويجعل الكود سهل الفهم.
  • يدعم القيم الافتراضية و...rest.
const points = [[1, 2], [3, 4], [5, 6]];

for (const [x, y] of points) {
  console.log(`X: ${x}, Y: ${y}`);
}
JavaScript
const entries = ['a', 'b', 'c'];

for (const [index, value] of entries.entries()) {
  console.log(index, value);
}
JavaScript
const pairs = [[1, 2], [3, 4], [5, 6]];

for (const [x, y] of pairs) {
  console.log(x + y);
}
JavaScript

8. تفكيك متداخل (Nested Destructuring)

const data = [[1, 2], [3, 4]];
const [[a1, b1], [a2, b2]] = data;
console.log(a1, b1, a2, b2); // 1 2 3 4
JavaScript
const users = [['Yasin', 25], ['Ali', 30]];
const [[name1, age1], [name2, age2]] = users;
console.log(name1, age2); // Yasin 30
JavaScript

9. الإرجاع من دالة (Destructuring Return Values)

function getCoords() {
  return [5, 10];
}

const [x, y] = getCoords();
console.log(x, y); // 5 10
JavaScript
function splitName(fullName) {
  return fullName.split(' ');
}

const [first, last] = splitName('Yasin Ahmed');
console.log(first); // Yasin
console.log(last);  // Ahmed
JavaScript

10- مع قيم افتراضية في معاملات الدوال (Default Parameters)

function draw([x = 0, y = 0] = []) {
  console.log(`x: ${x}, y: ${y}`);
}

draw();       // x: 0, y: 0
draw([5]);    // x: 5, y: 0
JavaScript
function init([lang = 'JavaScript', level = 'Beginner'] = []) {
  console.log(`${lang} - ${level}`);
}

init();                  // JavaScript - Beginner
init(['Python']);        // Python - Beginner
init(['HTML', 'Pro']);   // HTML - Pro
JavaScript
❗ملاحظات مهمة:
  • Destructuring يعمل فقط مع iterables مثل arrays و strings.
  • يمكنك استخدامه مع functions، loops، و default parameters.
  • يمكن استخدامه داخل كائنات أيضًا (لكن هذا موضوع مختلف: destructuring objects)