10 متد مفید جاوااسکریپت در رابطه با آرایهها
1 اردیبهشت
سلام دوستان. امیدوارم حالتون خوب باشه. در موقع کار کردن با جاوااسکریپت یکی از مواردی که زیاد استفاده میشه آرایهها هستند و برای کار کردن با آرایهها باید بتونید اونها رو به شکل دلخواهتون دستکاری کنید. در اینجا مقالهای رو باهم مرور میکنیم که 10 متد مفید و مهم رو برای کار کردن با آرایهها بررسی و با مثال بیان کرده. البته ممکن هست که بعضی جاها رو با توضیح بیشتر یا به شکل متفاوتی بیان کنم. لینک اصلی مقاله رو هم براتون آخر مقاله میذارم.
1. متد forEach
اگر به زبانهای برنامهنویسی دیگر و حتی به خود جاوااسکریپت آشنا باشید حتما از حلقههای for
برای مرور و انجام عملیات روی اجزای آرایه زیاد استفاده کردهاید. متد forEach
کار مشابهی رو برای ما انجام میده:
const arr = [1, 2, 3, 4, 5, 6];
arr.forEach(function(item, index) {
console.log(index); // output: 0 1 2 3 4 5
console.log(item); // output: 1 2 3 4 5 6
});
همانطور که مشاهده میکنید متد forEach
یک تابع با ورودیهای item
و index
میگیره که اولی هرکدام از اعضای آرایه و دومی مکان قرارگیری یا ایندکس آن عضو است. توجه کنید که index
از صفر شروع میشود.
2. متد includes
این متد مشخص میکند آیا مقداری که دنبال آن هستیم در آرایه وجود دارد یا نه. استفاده از آن به صورت زیر است:
const arr = [1, 2, 3, 4, 5, 6];
arr.includes(2); // output: true
arr.includes(7); // output: false
همانطور که مشاهده میکنید عدد 2 در آرایه موجود است. بنابراین این متد مقدار true
را برمیگرداند. اما چون عدد 7 در آرایه موجود نیست مقدار برگردانده شده توسط این متد false
است.
3. متد filter
این متد یک آرایهی جدید میسازد و اعضای این آرایه آنهایی هستند که شرط filter
در آنها برقرار است. مثال زیر را ببینید:
const arr = [1, 2, 3, 4, 5, 6];
// item(s) greater than 3
const filtered = arr.filter(function(num){ return num > 3; });
console.log(filtered); // output: [4, 5, 6]
console.log(arr); // output: [1, 2, 3, 4, 5, 6]
همانطور که در مثال بالا ملاحظه میکنید متد filter
به عنوان ورودی، یک تابع را با ورودی num
(که هر کدام از اعضا را وارد تابع میکند) گرفته و تنها در صورتی که آن تابع برای عضو آرایه مقدار true
برگرداند آن عضو آرایه در آرایهی جدید حضور خواهد داشت. همانطور که میبینید آرایه filtered
دارای اعضای 4، 5 و 6 است که همگی از 3 بزرگترند. همچنین آرایهی اول یعنی arr
تغییری نخواهد کرد.
4. متد map
متد map
به ازای هریک از اعضای آرایه یک تابع را اجرا کرده و مقداری که آن تابع برمیگرداند را در آرایه جدیدی میریزد. به شکل زیر:
const arr = [1, 2, 3, 4, 5, 6];
// double every element
const doubled = arr.map(function(num) { return num * 2; });
console.log(doubled); // output [2, 4, 6, 8, 10, 12]
console.log(arr); // output: [1, 2, 3, 4, 5, 6]
همانطور که مشاهده میکنید تابعی که درون map
قرار دارد هریک از اعضای آرایهی arr
را دوبرابر کرده و در آرایهی doubled
میریزد. نتیجه یعنی doubled
آرایهای است که اعضای آن دوبرابر شدهی اعضای arr
هستند و همانطور که میبینید خود arr
نیز تغییری نداشته است.
5. متد reduce
کاری که متد reduce
انجام میدهد این است که با گرفتن یک “جمع کننده” (accumulator) و هریک از اعضای آرایه، اعضای آرایه را به “یک مقدار” مشخص تقلیل میدهد. برای روشن شدن موضوع به مثال زیر دقت کنید:
const arr = [1, 2, 3, 4, 5, 6];
const sum = arr.reduce(function(total, value){ return (total + value); }, 0);
console.log(sum); // 21
همانطور که در مثال بالا ملاحظه میکنید، reduce
دو مقدار میگیرد: اول یک تابع که تکتک مقادیر را (value
) میگیرد و مقداربرگشتی از آن تابع به “جمعکننده” (total
) اضافه میشود. هر مقداری که این تابع برگرداند داخل جمعکننده ذخیره میشود تا در هنگام اجرای تابع برای عضو بعدی آرایه بتوان از آن استفاده کرد. دوم مقدار اولیهی جمع کننده که اینجا صفر است. بنابر توضیحات گفته شده چیزی که از کد بالا انتظار داریم مجموع اعداد آرایه است که در ثابت sum
قرار میگیرد. اگر بخواهیم با استفاده از for
مشابه کد بالا را بنویسیم به شکل زیر در میآید:
const arr = [1, 2, 3, 4, 5, 6];
let sum = 0;
for(let i = 0; i< arr.length; i++){
sum += arr[i];
}
console.log(sum); //21
همانطور که میبینید کد اول نسبت به این کد کوتاهتر و دارای خوانایی بیشتری است. بخصوص اگر بخواهید عملیات مفصلتری را بر روی اعضای آرایه انجام دهید.
6. متد some
این متد یک شرط را به عنوان ورودی میگیرد و بررسی میکند تا این شرط حداقل روی یکی از اعضای آرایه (و بیشتر) صدق کند. در این صورت مقدار true
برمیگرداند. اگر شرط روی هیچکدام از اعضا صادق نبود مقدار برگردانده شده false
خواهد بود. مثال:
const arr = [1, 2, 3, 4, 5, 6];
// at least one element is greater than 4?
const largeNum = arr.some(function (num) { return num > 4; });
console.log(largeNum); // output: true
// at least one element is less than or equal to 0?
const smallNum = arr.some(function (num) { num <= 0; });
console.log(smallNum); // output: false
در مثال بالا، بار اول چک کردهایم آیا آرایه عددی بزرگتر از 4 دارد یا نه (خط 4). که مشخصا جواب true
خواهد بود که این مقدار داخل largeNum
ریخته میشود. بار دوم در خط 8 چک کردهایم آیا آرایه عددی کمتر از صفر دارد یا نه و اینبار جواب منفی یا false
است که این مقدار داخل smallNum
ریخته میشود.
7. متد every
متد every
دقیقا مشابه متد some
پیادهسازی میشود. با این تفاوت که شرط باید روی همهی اعضای آرایه صادق باشد. مثال:
const arr = [1, 2, 3, 4, 5, 6];
// all elements are greater than 4
const greaterFour = arr.every(function (num) { return num > 4; });
console.log(greaterFour); // output: false
// all elements are less than 10
const lessTen = arr.every(function (num) { return num < 10; });
console.log(lessTen); // output: true
در خط 4 بررسی میکنیم آیا همهی اعضای آرایه از 4 بزرگتر هستند؟ که البته جواب false
است. در خط 8 بررسی میکنیم آیا همهی اعضای آرایه از 10 کمتر هستند؟ بله و جوابtrue
است.
8. متد sort
با این متد میتوان اعضای یک آرایه را به شکل صعودی یا نزولی مرتب کرد. برای مشخص شدن نحوهی کار به مثال زیر توجه کنید:
const arr = [1, 2, 3, 4, 5, 6];
const alpha = ['e', 'a', 'c', 'u', 'y'];
// sort in descending order
descOrder = arr.sort(function (a, b) { return a > b ? -1 : 1; });
console.log(descOrder); // output: [6, 5, 4, 3, 2, 1]
// sort in ascending order
ascOrder = alpha.sort(function (a, b) { return a > b ? 1 : -1; });
console.log(ascOrder); // output: ['a', 'c', 'e', 'u', 'y']
یک تابع با دو ورودی وارد sort
میشود. ورودیها با یکدیگر مقایسه میشوند. بسته به مقایسهی دو عضو، اگر مقداری کوچکتر از صفر برگردانده شود، مقدار a
در ایندکس کمتری نسبت به مقدار b
قرار میگیرد و اگر مقداری بزرگتر از صفر برگردانده شود، b
در ایندکس کمتری نسبت به a
قرار میگیرد. در صورتی که صفر برگردانده شود، ترتیب a
و b
تغییر داده نمیشود. برای مثال در خط 5، گفته شده که اگر a
از b
بزرگتر باشد در ایندکس کمتری قرار بگیرد (برگرداندن مقدار منفی) و این به معنی مرتبسازی نزولی است. در خط 9 نیز حروف با هم مقایسه شده و گفته شده اگر ترتیب الفبایی a
بزرگتر از b
باشد، b
در ایندکس کمتری نسبت به a
قرار بگیرد (برگرداندن مقدار مثبت) که به معنی مرتبسازی صعودی است.
این قابلیتِ انتخابی بودن تابع ورودی در sort
باعث میشود این متد انعطافپذیری بالایی داشته باشد. مثلا اگر بخواهیم آرایهای از آرایهها (آرایهی دو بعدی) را بر اساس یکی از اعضای آرایههای داخلی مرتبسازی کنیم میتوانیم بنویسیم:
const arr = [[2, 'two'], [4, 'four'], [3, 'three'], [1, 'one']];
const newArr = arr.sort(function (a, b) { return a[0] - b[0]; });
console.log(newArr);
اگر a[0]
بزرگتر از b[0]
باشد، مقدار بزرگتر از صفر برگردانده شده و b
در ایندکس کمتری نسبت به a قرار میگیرد که به معنی مرتبسازی صعودی نسبت به مقدار اول آرایههای داخلی است.
9. متد Array.from
این متد یک مقدار شبهآرایه یا قابل گسترش (iterable) را گرفته و از آن یک آرایهی واقعی میسازد. در مورد مقادیر قابل گسترش بعدها مینویسم و اینجا لینک میکنم ولی توصیه میکنم اگر در مورد این نوع مقادیر اطلاعی ندارید گوگل کنید. مثال زیر را ببینید:
const name = 'Maysam';
const nameArray = Array.from(name);
console.log(name); // output: Maysam
console.log(nameArray); // output: ['M', 'a', 'y', 's', 'a', 'm']
همانطور که میدانید مقادیر رشتهای (String) جزو مقادیر گسترشپذیر محسوب میشوند و میتوان آن را نسبت به کاراکترها گسترش و به آرایهای از کاراکترها تبدیل کرد. چیزی که کد بالا به روشنی نمایش میدهد. این متد در مورد تبدیل عبارات شبهآرایهای به آرایه واقعی نیز کاربرد دارد. مثال زیر را ببینید:
// I assume that you have created unorder list of items in our html file.
const lis = document.querySelectorAll('li');
const lisArray = Array.from(document.querySelectorAll('li'));
// is true array?
console.log(Array.isArray(lis)); // output: false
console.log(Array.isArray(lisArray)); // output: true
در مثال بالا فرض شده ما در فایل HTML خود چند تگ li
داریم. در خط 3 این کدها توسط querySelectorAll
به شکل شبهآرایهای داخل متغیر lis
ریخته شده است. در خط 4 این مقدار شبه آرایهای به آرایه واقعی تبدیل شده است. همانطور که میبینید در خط 7 متد isArray
برای متغیر lis
مقدار false
برمیگرداند و آن را آرایه نمیشناسد. اما در خط 8 نوع lisArray
را آرایه تشخیص میدهد.
نکته:
در اینجا لازم هست اشاره کنم که روش دیگری برای تبدیل مقادیر قابل گسترش و شبهآرایه به آرایهی واقعی نیز وجود دارد که کوتاهتر است و آن استفاده از اوپراتور ...
است. به بازنویسیهای کدهای بالا با این روش دقت کنید:
const name = 'Maysam';
const nameArray = [...name];
console.log(name); // output: Maysam
console.log(nameArray); // output: ['M', 'a', 'y', 's', 'a', 'm']
// I assume that you have created unorder list of items in our html file.
const lis = document.querySelectorAll('li');
const lisArray = [...document.querySelectorAll('li')];
// is true array?
console.log(Array.isArray(lis)); // output: false
console.log(Array.isArray(lisArray)); // output: true
10. متد of
این متد همه مقادیری که به عنوان ورودی به آن داده میشود را داخل یک آرایه ریخته و آن را برمیگرداند. مثال:
const nums = Array.of(1, 2, 3, 4, 5, 6);
console.log(nums); // output: [1, 2, 3, 4, 5, 6]
اقتباس شده از:
10 JavaScript array methods you should know
26 خرداد جاوااسکریپت data binding، اتصال داده، و جاوااسکریپت
مفاهیم اولیهی اتصال داده (data binding) در جاوااسکریپت
یکی از مهمترین الگوهای توسعهی اپلیکیشنهای جاوااسکریپتی، جدا کردن دادهها و ظاهر اپلیکیشن از همدیگر و اتصال این دو به یکدیگر به شکل یکسویه یا دوسویه است. به طوری که با تغییر داده، ظاهر مرتبط با آن داده عوض و به شکل متقابل با تغییر در ظاهر برنامه (مانند پر کردن فرم یا تغییر مکان یک شی) داده مرتبط با آن دچار تغییر شود. امروزه اتصال داده در اپلیکیشنهای تحت وب برای برنامهنویس از نان شب واجبتر است! البته فریمورکهای متداول مانند ReactJs، این اتصال داده را به خوبی برای برنامهنویسان پیشبینی کردهاند و در این مقاله قرار نیست فریمورک توسعه بدهیم. اما به دلایلی خوب است اساس و اصول اتصال داده در جاوااسکریپت را درک کنیم. برای فهمیدن این دلایل و کشف راز اتصال داده در جاوااسکریپت با من همراه شوید.
13 اردیبهشت جاوااسکریپت جاوااسکریپت
this در جاوااسکریپت را بهتر بشناسیم
کلیدواژهی this در جاوااسکریپت یکی از مفهومهایی است که باعث سردرگمی مبتدیان این زبان میشود. شاید یکی از دلایل این موضوع این باشد که کلیدواژهی this در جاوااسکریپت، در مقایسه با زبانهای برنامهنویسی دیگر اندکی متفاوت است. از طرفی یادگیری این کلیدواژه بسیار ضروری است. چرا که برای خواندن و نوشتن کدهای حرفهای و درک مفاهیم جاوااسکریپت همواره به آن نیاز خواهیم داشت. در این مقاله به بررسی این کلیدواژه و کاربردهای مختلفی که در زبان جاوااسکریپت دارد میپردازیم.
5 اردیبهشت جاوااسکریپت Promise و جاوااسکریپت
Promiseها در جاوااسکریپت - بخش اول
جاوااسکریپت از جمله زبانهایی است که اتفاقات غیر همزمان (asynchronous) در آن معمول و متداول است. مثلا وقتی یک درخواست به سرور میفرستید جاوااسکریپت منتظر نمیماند تا پاسخ آن دریافت شود. بلکه به اجرای خط به خط برنامه ادامه میدهد. اما این همیشه مطلوب نیست. بعضی اوقات لازم است تا از جاوااسکریپت قول بگیریم که بعد از مشخص شدن تکلیف اجرای یک دستور غیر همزمان کاری را انجام دهد. اینجاست که راه Promiseها به قضیه باز میشود. دنیای برنامهنویسی غیر همزمان دنیای مرموز و گاها دشواری است. پس بیایید یکی از بهترین مقالات را در این زمینه مرور کنیم.
6 اردیبهشت جاوااسکریپت Promise و جاوااسکریپت
Promiseها در جاوااسکریپت – بخش دوم
در این مقاله مبحث پیشین را ادامه میدهیم. سعی میکنیم نحوهی تعامل با Promiseها را یک به یک مرور کرده و با مثال ابعاد مختلف این مفهوم را واکاوری کنیم.