کار بر روی آرایه ها در جاوااسکریپت

یکی از زبان ها محبوب این روزها زبان جاوا اسکریپت است. یکی از قابلیت های جالب این زبان امکان برنامه نویسی اعلانی است بر خلاف برنامه نویسی دستوری. اما منظور از برنامه نویسی اعلانی چیست؟ چه تفاوتی با برنامه نویسی دستوری دارد؟ در ادامه سعی می کنیم ضمن معرفی چند تابع پرکاربرد در جاوا اسکریپت این دو مفهوم را معرفی کنیم.

برنامه نویسی دستوری:

در این روش ما دقیقا به کامپیوتر بیان می کنیم چه الگوریتمی را باید اجرا کند تا به خروجی مورد نظر دست یابیم. به عنوان مثال می خواهیم حاصل جمع عناصر یک آرایه را بدست بیاوریم. در روش دستوری از کدی مشابه کد زیر استفاده می کنیم:

// to calculate the sum of array elements
const sum = (arr) => {
let result = 0;
for (let i = 0; i < arr.length; i++) {
result += arr[i];
}
return result;
};


در کد فوق دقیقا نحوه محاسبه حاصل جمع عناصر آرایه را بیان کرده ایم. و کامپیوتر برای اجرای این دستورات نیاز به تفسیر خاصی ندارد.

برنامه نویسی اعلانی:

با توسعه زبان های برنامه نویسی به سمت و سوی زبان های سطح بالاتر می رویم زبان های برنامه نویسی سطح بالا بسیاری از فرایند های پر تکرار را فرموله کرده اند فرایندهایی از قبیل پیمایش آرایه ها، مرتب سازی آرایه ها جستجو و ... . در زبان های جدید به جای این که به کامپیوتر بگوییم چه بکند می گوییم چه می خواهیم به عنوان مثال برنامه فوق به صورت زیر باز نویسی می شود:

// calculate the sum of array elements
const sum = (arr) => arr.reduce((total, item) => total += item, 0);

برنامه تفاوت دو کد یاد شده در این است که در این کد ما به کامپیوتر می گوییم می خواهیم حاصل جمع مقادیر آرایه ها را بر گرداند. جزییات کار بر عهده زبان برنامه نویسی است. برتری روش اعلانی به روش دستوری این است که معمولا حجم کد کمتر، خوانایی کد بیشتر و سرعت اجرا بعضا بیشتر است.

تابع filter

فرض کنید آرایه ای از اشیا را داریم و می خواهیم از بین عناصر آنها برخی را فیلتر نماییم به عنوان مثال آرایه به صورت زیر در اختیار داریم حال اگر بخواهیم آرایه را به گونه ای فیلتر کنیم که فقط عناصر که مقدار صفت faction آن برابر "Rebels" را برگرداند برای این منظور می توانیم از تابع filter و کدی همانند کد زیر استفاده نماییم:

var rebels = pilots.filter(function (pilot) {
return pilot.faction === "Rebels";
});


var pilots = [
{
id: 2,
name: "Wedge Antilles",
faction: "Rebels",
},
{
id: 8,
name: "Ciena Ree",
faction: "Empire",
},
{
id: 40,
name: "Iden Versio",
faction: "Empire",
},
{
id: 66,
name: "Thane Kyrell",
faction: "Rebels",
}
];

تابع map

گاهی لازم است بر روی همه عناصر آرایه عملیاتی اجرا شود و نتیجه برگردانده شود مثال فرض کنید آرایه فوق را در اختیار داریم و بخواهیم یکی از صفات اشیا مثال faction را حذف کنیم برای این کار می توانیم از دستورات زیر استفاده کنیم:

var rebels = pilots.map(function (pilot) { return {id:pilot.id,name:pilot.name });

تابع reduce

گاهی می خواهیم عملیاتی تجمیعی بر روی تمامی عناصر یک آرایه انجام دهیم و نتیجه را استخراج کنیم عملیاتی مانند جمع کردن مقادیر یک صفت، پیدا کردن مقدار ماکزیمم یا مینیمم یک صفت و ... . در این شرایط می توانیم از تابع reduce استفاده کنیم. مثال فرض کنید بخواهیم حاصل جمع مقدارid عناصر آرایه فوق را بدست آوریم در این شرایط می توانیم از دستورات زیر استفاده کنیم:

const total = pilots.reduce((acc, item) => acc+= item, 0);

منابع:

در این پست سعی شد قسمتی از قابلیت های جالب زبان جاوا اسکریپت و برنامه نویسی اعلانی بیان شود برای مطالعه بیشتر می توانید به منابع زیر مراجعه کنید:

https://medium.com/poka-techblog/simplify-your-javascript-use-map-reduce-and-filter-bd02c593cc2d
https://overflowjs.com/posts/Map-Reduce-Filter-In-Javascript.html