تطوير المواقع الإلكترونية MEAN-Stack from A to Z الأساسيات Level1
تحدثنا من قبل عن وجود نوعان من أنواع الـ Data Types في الجافاسكريبت الأول هو Primitive Types و الثاني هو الـ Non Primitive Types و تعد الـ array و الـ object من أنواع البيانات الـ Non Primitive و سنتطرق للإختلاف الجوهري بينهما لاحقا عند الحديث عن كيف يتم تنفيذ الكود في الجافاسكريبتالـ Array هي عبارة عن متغير يمكن ان يحتوي علي العديد من المتغيرات و هو من أكثر العناصر البرمجية شيوعا و إستخداما حيث أن الداتا أصبحت هي أساس أي تطبيق و الـ array صممت بالأساس لتعمل على البيانات فمثلا لو كنا نقوم ببرمجة تطبيق يقوم بإدارة المخازن هل من المنطقي ن نقوم بإنشاء متغير لكل صنف من أصناف البضاعة بالمخزن؟ حتى لو حاولنا عمل تلك المهمة فإننا في الحياة الواقعية في مجال تطوير المواقع و التطبيقات نتعامل مع كم متغير من البيانات لا نعرف عدده و لا نعرف كيف سيزيد أو سينقص في حالة مثال برنامج إدارة بضائع المخزن فمن الوارد أن تظهر أصناف جديدة لم تكن معروفة وقت البرمجة أو أن تختفي أصناف من السوق فهنا تأتي أهمية وجود الـ array فيمكننا كتابة متغير واحد يحتوي علي أي عدد من الأصناف كمثال
let products = ['sugar','oil','rice','salt'];
let myArray = [1,"hi",[1,2,3]];
console.log(products[0]);
العمليات الخاصة بالـ array
1- معرفة عدد عناصر الـ array
عن طريق length كما في الكود التالي :
console.log(products.length);
console.log(products[products.length -1]);
2- الوصول لـ array بداخل array و إحضار قيمة منها
في حالة الnested array يمكننا الوصل للـ array الداخلية كالمثال التالي:
let myArray = [1,"hi",[1,2,3]];
console.log(myArray[2][0]);
3- تغيير قيمة أحد عناصر المصفوفة
مثل أي متغير نستطيع إعادة تعيين قيمته ايضا في الـ arrays نستطيع إعادة تعيين القيمة عند تحديد العنصر بالـ index و اعطاءه قيمة جديدة مثل
let products = ['sugar','oil','rice','salt'];
products[0] = 'pasta';
document.write(products);
4- إضافة عنصر للـ array
يمكن إضافة عنصر للـ array بأكثر من طريقةإضافة عنصر في اخر المصفوفة
مثلا array تحتوي علي العناصر 1 2 3 و نريد اضافة رقم 4 في أخر المصفوفة بعد الرقم 3 نستخدم push كما في الكود التالي
let myArray = [1,2,3]
myArray.push(4);
document.write(myArray);
myArray.push(4,5,6);
إضافة عنصر في أول المصفوفة
يمكن ذلك عن طريق unshift كما بالكود التالي
let myArray = [1,2,3]
myArray.unshift(0);
document.write(myArray);
let myArray = [1,2,3]
myArray.unshift(-1,0);
document.write(myArray);
5- حذف عنصر من الـ array
أيضا يمكن مسح العنصر من الـ array بطريقتينحذف عنصر من نهاية الـarray
يمكن ذلك عن طريق إستخدام pop كما في المثال التالي:
let myArray = [0,1,2,3]
myArray.pop();
document.write(myArray);
let myArray = [0,1,2,3]
console.log(myArray.pop());
حذف عنصر من بداية الـ array
عن طريق الأمر shift الذي يعد أيضا عكس الأمر unshift الذي إستخدمناه لإضافة عنصر و أيضا مثل الأمر pop يقوم الأمر shift بحذف عنصر من أول المصفوفة و الإحتفاظ به مثل الكود التالي
let myArray = [0,1,2,3]
console.log(myArray.shift());
document.write(myArray);
6- حذف عنصر أو عدد من العناصر من الـ array
يمكن استخدام الأمر splice لتأدية تلك المهمة و هو أمر شديد الأهمية يمكن من خلاله تأدية مهام حذف و إضافة معقدة علي الـ array يتم تمرير عدد من القيم لذلك الأمر البداية تمرير قيمة الـ index الذي سنبدأ الحذف من عنده , بعدها يتم تمرير عدد العناصر المراد حذفها من المصفوفة كالتالي:
let myArray = [1,2,3,4]
myArray.splice(1,2)
document.write(myArray);
let myArray = [1,2,3,4]
let myNewArray = myArray.splice(1,2);
document.write("my old array: " + myArray);
document.write(' my new array: ' + myNewArray);
7- استبدال عناصر بالـ array
ماذا لو اردنا كما في المثال السابق حذف مجموعة من العناصر و لكن إضافة مجموعة أخري من العناصر بدلا منها , يمكننا إستخدام الأمر splice نفسه و تمرير العناصر المراد إضافتها فبعد تحديد عنصر البداية و بعد تحديد عدد العناصر المراد حذفها يتم تمرير العناصر المراد إضفاتها مكان العناصر المحذوفة كالتالي:
let myArray = [1,2,3,4]
myArray.splice(0,2,-1,-2);
document.write(myArray);
في الكود السابق قمت بحذف عنصريين من الـ array بداية من الموضع 0 (أول الـ array) و قمت بإضافة بدلا منهما عنصريين أخريين و يمكن إضافة أي عدد من العناصر دون التقيد بعدد معين ممكن أن نقوم بحذف عنصريين و إضافة 4 أو 5 عناصر تبعا لإحتياجتنا.
8- اضافة عناصر للـ array
تحدثنا من قبل عن كيفية اضافة عنصر للـ array في أوله أو أخره و لكن ماذا لو أردنا إضافة عنصر في وسط الـ array يمكن أستخدام اكثر من طريقة مثلا يمكننا استخدام الأمر السابق splice و لكن من دون تحديد رقم العنصر المحذوفة كالتالي:
let myArray = [1,2,3,4]
myArray.splice(2,0,2.5,2.6);
document.write(myArray);
9- إنشاء array جديدة بعناصر من array موجودة بالفعل
يمكن استخدام الأمر slice للقيام بتلك المهمة كالتالي:
let myArray = [0,1,2,3,4,5,6,7]
let myNewArray = myArray.slice(1,4);
document.write('my old array: ' + myArray + " my new array: " + myNewArray);
let myArray = [0,1,2,3,4,5,6,7]
let myNewArray = myArray.slice(-4,-1);
document.write('my old array: ' + myArray + " my new array: " + myNewArray);
و يكون نتيجة تنفيذ الكود my old array: 0,1,2,3,4,5,6,7 my new array: 4,5,6
10- التأكد من وجود عنصر داخل الـ array
يمكننا البحث بداخل الـ array عن طريق استخدام indexof و هي تمكننا من معرفة رقم الـ index الذي يحتوي علي القيمة المراد البحث عنها مثلا كما في الكود التالي:
let myArray = ['sugar','oil','rice','salt']
console.log(myArray.indexOf('oil'));
let myArray = ['sugar','oil','rice','salt']
console.log(myArray.indexOf('oil',2));
let myArray = ['sugar','oil','rice','oil','salt']
console.log(myArray.indexOf('oil'));
let myArray = ['sugar','oil','rice','oil','salt']
console.log(myArray.lastIndexOf('oil'));
11- إعادة ترتيب عناصر الـ array
يمكن استخدام الأمر sort لترتيب الـ array كما في الكود التالي:
let myArray = ['sugar','oil','rice','salt']
console.log(myArray.sort());
let myArray = [1,3,0,2,9,7,8]
console.log(myArray.sort());
let myArray = [1,3,0,2,9,7,8]
console.log(myArray.reverse());
let myArray = [1,3,0,2,9,7,8]
console.log(myArray.sort().reverse());
12- الدمج ما بين أكثر من array
بإفتراض اننا نريد دمج array تحمل القيم التالية 1, 2, 3, 4 و array أخري تحمل القيم التالية 5,6,7,8 يمكننا القيام بذلك عن طريق الأمر concat كما بالكود التالي:
let myArray = [1,2,3,4];
let myNewArray = [5,6,7,8]
console.log(myArray.concat(myNewArray));
let myArray = [1,2,3,4];
let myNewArray = [5,6,7,8]
console.log(myArray.concat(myNewArray,9,10,11));
13- دمج العناصر بداخل الـ array
في الكثير من الأحيان يكون لدينا array و نريد عرضها للمستخدم , يمككنا عرضها باستخدام الكود التالي:
let myArray = [1,2,3,4];
console.log(myArray);
let myArray = [1,2,3,4];
console.log(myArray.join());
let myArray = [1,2,3,4];
console.log(myArray.join('-'));
14- الوصول لقيمة كل عنصر من الـ array عن طريق الـ loop
يمكن لجمل الـloop مثل for , while, do while الوصول لكل عنصر من عناصر الـ arry مثل المثال التالي:
let myArray = [1,2,3,4,5,6];
for(var i = 0;i <myArray.length;i++)
{
console.log(myArray[i]);
}
myArray.forEach((myElemnt)=>{
console.log(myElemnt);
}
)
15- عمل declaration لـ array بدون تعيين قيم لها
مثل أن تقوم بعمل array و تعيين قيمها بشكل dynamic بالكود مثل المثال التالي:
let myArray = new Array; //or let myArray = [];
for(var i = 0;i < 10;i++)
{
myArray.push(i);
}
16- استخدام الـ map
من أجل إنشاء array جديدة بخصائص معدلة من array قائمة مثل:
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(number => number * 2);
console.log(doubled); // [2, 4, 6, 8, 10]
17- الـ filter
يستخدم من أجل إنشاء array جديدة من array قديمة بعد إختيار بعض عناصر الـ array القديمة التي تحقق شرط معين مثل:
const numbers = [1, 2, 3, 4, 5];
const evens = numbers.filter(number => number % 2 === 0);
console.log(evens); // [2, 4]
18-الـ reduce
تستخدم لتنفيذ عملية على جميع مكونات المصفوفة من أجل إستخراج قيمة واحدة مثل جمع مكونات المصفوفة أو حاصل ضرب جميع مكوناتها و هكذا
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, number) => acc + number, 0);
console.log(sum); // 15
و في هذا السياق قد نسأل أنفسنا لماذا قد نحتاج لتمرير المصفوفة التي نقةم بعمل reduce عليها للـ callback function بينما في الأساس نحن نقوم بإستدعاء الـreduce ك method من داخل المصفوفة نفسها، و هذه العملية يمكن أن يكون لها فوائد عديدة من ضمنها مثلا في حالة الحاجة لإستدعاء الـ array أو استخدامها لأي سبب نقوم بإستخدام الـ array التي يتم تمريرها للـ callback function لتجنب إستخدام الـ array الأصلية لأنها في تلك الحالة (الـ array الأصلية) تكون في scope خارجي (خارج scope الـ callback function ) و هي في تلك الحالة أفضل حيث سرعة أداء البرنامج و تجنب استخدام الـ closures مثلا:
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, number,index,nums) =>
{
console.log(nums);
return acc + number}
, 0);
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, number,index,nums) =>
{
console.log(numbers);
return acc + number}
, 0);
19- الـ find
تستخدم لإسترجاع أول عنصر في المصفوفة يحقق الشرط مثل
const numbers = [1, 2, 3, 4, 5];
const found = numbers.find(number => number > 3);
console.log(found); // 4
الـ find يتم تمرير لها callback function تطلب 3 parameters و هم (element, index, array) مع ملاحظة أن الـ index , array إختياريين.
تقوم بإرجاع القيمة undefined إذا لم يتم ايجاد العنصر الذي يحقق الشرط.
20- الـ findIndex
تقوم بإرجاع الـ index الخاص بالعنصر الذي يحقق الشرط (أول عنصر يحقق الشرط) و تقوم بإرجاع 1- عندما لا تجد عنصر يحقق الشرط.
const numbers = [1, 2, 3, 4, 5];
const index = numbers.findIndex(number => number > 3);
console.log(index); // 3
21- الـ some
تحدد هل تحقق بعض عناصر الـ array شرط معين و تقوم بإرجاع true في حالة تحقيق الشرط و false في حالة عدم تحققه مثل:
const numbers = [1, 2, 3, 4, 5];
const hasEven = numbers.some(number => number > 4);
console.log(hasEven); // true
22- الـ every
تحدد هل تحقق جميع عناصر الـ array الشرط أم لا و تقوم بإرجاع true في حالة تحقيق جميع العناصر للشرط و تقوم بإرجاع false في حالة إذا كان عنصر واحد فقط على الأقل لا يحقق الشرط مثل:
const numbers = [1, 2, 3, 4, 5];
const allEven = numbers.every(number => number % 2 === 0);
console.log(allEven); // false
23- الـ includes
تتحقق من أن الـ array تحتوي على قيمة معينة أم لا و تقوم بإرجاع true في حالة أن الـ array تحتوي على عنصر بنفس القيمة و تقوم بإرجاع false في حالة عدم إحتوائها لعنصر بنفس القيمة مثل:
const numbers = [1, 2, 3, 4, 5];
const includesThree = numbers.includes(3);
console.log(includesThree); // true
24- الـ flat
عندما يكون هناك array تحتوي على عناصر متداخلة من الـ array مثل const nestedArray = [1, [2, [3, [4, 5]]]] يمكن إستخدام الـ flat لتبسيط التداخل بين الـ arrays مثل:
const nestedArray = [1, [2, [3, [4, 5]]]];
const flatArray = nestedArray.flat(2);
console.log(flatArray); // [1, 2, 3, [4, 5]]
25- الـ flatMap
تقوم تلك الـ method بتعيين array جديدة و تعيين بداخلها عناصر الـ array القديمة بعد اجراء تعديلات عليها و بعد ذلك إزالة الـ nested array أي أنها تجمع ما بين الـ map و الـ flat و يمكن استخدامها مثل:
const numbers = [1, 2, 3];
const doubledAndFlattened = numbers.flatMap(number => [number,number * 2]);
console.log(doubledAndFlattened); // [1, 2, 2, 4, 3, 6]
const numbers = [1, 2, 3];
const doubled = numbers.map(number => [number,number * 2]);
console.log(doubled);
يمكن توضيح فائدة الـ flatMap بشكل عملي بالمثال التالي:
const sentences = ["Hello world", "This is flatMap", "JavaScript is cool"];
const words = sentences.flatMap(sentence => sentence.split(' '));
console.log(words);
// Output: ["Hello", "world", "This", "is", "flatMap", "JavaScript", "is", "cool"]
26- الـ spread
و هي خاصية مهمة جدا تستخدم مع الـ array لتنفيذ العديد من العمليات بسهولة و بإختصار (كتابة كود أقل) و تستخدم الثلاثة نقاط "…” لكتابة جملة الـ spread ، و يمكن استخدامها في:إنشاء array جديدة من array قديمة
const no = [1,2,3,4,5];
const no1 = [...no];
const no = [1,2,3,4,5];
const no1 = no;
console.log(no === no1);//true
const no = [1,2,3,4,5];
const no1 = no;
no.push(6);
no1.push(7);
console.log(no);
console.log(no1);
و هو ما يسمى بالـ reference type بينما عند استخدام الـ spread لا يحدث هذا الأمر مثل:
const no = [1,2,3,4,5];
const no1 = [...no];
no.push(6);
no1.push(7);
console.log(no);
console.log(no1);
أي أننا قمنا بإنشاء array جديدة غير مرتبطة بالـ array القديمة و بالطبع يمكننا تحقيق ذلك بأكثر من طريقة مثل استخدام slice مثل الكود التالي:
const no = [1,2,3,4,5];
const no1 = no.slice(0);
no.push(6);
no1.push(7);
console.log(no);
console.log(no1);
const no = [1,2];
const no1 = [3,4];
const no2 = [5,6];
const myArray = [...no,...no1,...no2];
console.log(myArray);//[1,2,3,4,5,6]
const numbers = [2, 3, 4];
const extendedArray = [1, ...numbers, 5];
console.log(extendedArray); //[1, 2, 3, 4, 5]
const numbers = [1,2, 3];
const myFun = (param1,param2,param3)=>param1+param2+param3;
console.log(myFun(...numbers));//6
const arrayWithDuplicates = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(arrayWithDuplicates)];
console.log(uniqueArray); // Output: [1, 2, 3, 4, 5]
const mySet = new Set([1,2,3]);
console.log(mySet);
console.log(mySet[0]); //undefined
console.log(mySet.size);//3
const sumAll = (...args) => args.reduce((sum, current) => sum + current, 0);
console.log(sumAll(1, 2, 3, 4)); // Output: 10
console.log(sumAll(5, 10, 15)); // Output: 30
استخدام الـ Destructuring
الـ Destructuring في الجافاسكريبت يمكننا من تقسيم الـ array أو الـ object لتبسيط و تنظيم الكود و إنشاء متغيرات جديدة من قيم بداخل الـ array أو الـ object مثل:
const numbers = [1, 2, 3, 4, 5];
const [first, second, ...rest] = numbers;
console.log(first); // Output: 1
console.log(second); // Output: 2
console.log(rest); // Output: [3, 4, 5]


