در زبانهای برنامه نویسی، از loopها برای پیمایش عناصر یک مجموعه استفاده میشود. این پیمایش ممکن است صرفا جهت نمایش و یا دستکاری نمودن عناصر مجموعه، مورد استفاده قرار بگیرد (دستوراتی نظیر for,while,do while).
در ECMAScript 5 توابعی معرفی شد که میتوانیم از آنها بجای loopها استفاده کنیم.
با استفاده از تابع forEach، کد فوق بصورت زیر بازنویسی و خلاصه نویسی میشود:
با استفاده از تابع filter، کد فوق را بهبود میدهیم:
فرض کنید قرار است یک خروجی را بعد از پیمایش عناصر مجموعهای داشته باشیم (مجموع عناصر):
با استفاده از تابع reduce، کد فوق را بازنویسی میکنیم:
کد زیر را در نظر بگیرید که در آن قصد داریم عناصر مجموعهای را تبدیل به حروف بزرگ کنیم. اینکار به طور معمول با استفاده از loopهای معمول، به شکل زیر انجام میشود:
let names = ["Jack", "Jecci", "Ram", "Tom"]; let upperCaseNames = []; for(let i=0, totalNames = names.length; i< totalNames ; i= i +1) { upperCaseNames = names[i].toUpperCase(); }
let names = ["Jack", "Jecci", "Ram", "Tom"]; let upperCaseNames = names.map(name => name.toUpperCase());
تابع map یک آرایهی جدید را بازگشت میدهد (توسعه دهندگان React Js از این تابع استفاده زیادی دارند). وقتی تابع map را بکارمیبرید، قابلیت استفاده از دستوراتی مانند break , continue و return را نخواهید داشت و در صورت نیاز میتوانید از توابعی همچون some و یا every استفاده نمایید.
مثال دیگری را در نظر بگیرید که در آن قصد داریم یک action و عملی را روی عناصر مجموعهای اعمال کنیم. در اینجا چاپ عناصر در نظر گرفته شدهاست:
function print(name) { console.log(name); } let names = ["Jack", "Jecci", "Ram", "Tom"]; for(let i=0, totalNames = names.length; i< totalNames ; i= i +1) { print(names[i]) }
function print(name) { console.log(name); } let names = ["Jack", "Jecci", "Ram", "Tom"]; names.forEach(name=> print(name)); // اگر صرفا چاپ در کنسول مد نظر هست let names = ["Jack", "Jecci", "Ram", "Tom"]; names.forEach(name=> console.log(name));
در مثالی دیگر قصد فیلتر کردن عناصر مجموعهای را بر اساس شرطی خاص داریم (عناصر فرد):
function isOdd(n) { return n %2; } let numbers = [1,2,3,4,5]; let odd = []; for(let i=0, total = numbers.length; i< total ; i= i +1) { let number = numbers[i]; if( isOdd(number) ) { odd.push(number); } }
let numbers = [1,2,3,4,5, 6, 7] let odd = numbers.filter(n => n%2);
let numbers = [1,2,3,4,5] let result = 0; for(let i=0, total = numbers.length; i< total ; i= i +1) { result = result + numbers[i]; }
let numbers = [1,2,3,4,5,6,7]; function sum(accumulator, currentValue){ return accumulator + currentValue; } let initialVal = 0; let result = numbers.reduce(sum, initialVal); // یا بصورت زیر کد را خلاصه نمود let numbers = [1,2,3,4,5,6,7, 10]; let result = numbers.reduce((acc, val)=> acc+val, 0);
در مثال دیگری قصد بررسی این مورد را داریم که آیا آرایهای، دارای مقدار خاصی میباشد و در صورت دارا بودن آن آیتم، از ادامه پیمایش خارج شود:
let names = ["ram",, "rahul", "raj", "rahul"]; for(let i=0, totalNames = names.length; i< totalNames ; i= i +1) { if(names[i] === "rahul") { console.log(" found rahul"); break; } }
اکنون با استفاده از تابع some، بصورت زیر کد را بهبود میدهیم:
let names = ["ram",, "rahul", "raj", "rahul"]; let isRahulPresent = names.some(name => name==="rahul"); if(isRahulPresent) { console.log("found rahul"); }
در یک آرایه قصد داریم شرطی را بر روی همهی عناصر آن چک کنیم و در صورت صحت شرط، بر روی کل مجموعه، action یا عملی را انجام دهیم:
let numbers = [1,2,3,4,5, 0]; for(let i=0, total = numbers.length; i< total ; i= i +1) { if(numbers[i] <= 0) { console.log("0 present in array"); break; } }
این کد را با استفاده از تابع every، بصورت زیر بازنویسی میکنیم:
let numbers = [1,2,3,4,5,0]; let isZeroFree = numbers.every(e => e > 0); if(!isZeroFree) { console.log("0 present in array"); }
نتیجه گیری:
استفاده از این نوع توابع، مزیتهای زیر را به همراه دارد:
- خوانایی بهتر
- فهم راحت
- خطایابی آسانتر