از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
برای هر بیش از یک آرایه در جاوا اسکریپت اگر حتی برای مدت کوتاهی جاوا اسکریپت را می نویسید، احتمالا هنوز از سرعت تغییر زبان آگاه هستید. با توجه به همه این تغییرات، به این معنی است که راه های متعددی نیز برای انجام یک عملکرد مشابه وجود دارد. در این مورد منظور من حلقه زدن روی آرایه ها با استفاده از…
سرفصلهای مطلب
اگر حتی برای مدت کوتاهی جاوا اسکریپت می نویسید، احتمالا هنوز از سرعت تغییر زبان آگاه هستید. با توجه به همه این تغییرات، به این معنی است که راه های متعددی نیز برای انجام یک عملکرد مشابه وجود دارد. در این مورد من به حلقه زدن روی آرایه ها با استفاده از a اشاره می کنم for-each
ساختن.
پس بهترین راه برای انجام آن چیست؟ این سوال بستگی دارد روی چند چیز، مانند نسخه JS که استفاده میکنید، اگر میتوانید از روشهای نمونه استفاده کنید، و غیره. در این مقاله، تعدادی از راههای حلقه روی آرایهها در JS را بررسی خواهم کرد.
آرایه برای هر روش
روشی که به طور گسترده پشتیبانی می شود (به جز در IE 8، جای تعجب نیست) این است Array.prototype.forEach
روش. با پذیرش یک تابع تماس با پارامترها کار می کند currentValue
، index
، و array
. در بسیاری از موارد، تنها currentValue
و index
پارامترها استفاده می شود.
به عنوان مثال:
let items = ('one', 'two', 'three', 'four');
items.forEach(function(val, idx) {
console.log(`${idx}: ${val}`);
});
// Output:
//
// 0: one
// 1: two
// 2: three
// 3: four
این روش به دلیل سادگی و نحو تمیزی که دارد، یک روش عالی است، اگرچه برخی از معایب آن نیز وجود دارد. مهمتر از همه، خارج شدن از این حلقه، بر خلاف داخلی، دشوار است for
حلقه ای که می توانید از آن استفاده کنید break
کلمه کلیدی. با forEach
برای اینکه زودتر از حلقه خارج شوید باید یک استثنا بیاندازید.
به عنوان MDN اسناد اشاره می کند، اگر شما نیاز به شکستن از a forEach
حلقه، پس این روش ابزار اشتباهی است. در این مورد، برخی از گزینه های بهتر خواهد بود:
- ساخته شده است
for
حلقه (به تفصیل در زیر) - ساخته شده است
for-of
حلقه (به تفصیل در زیر) Array.prototype.every()
Array.prototype.some()
Array.prototype.find()
Array.prototype.findIndex()
را Array.prototype.*
روشهای بالا میتوانند با برگرداندن یک مقدار حقیقت که به حلقه میگوید آیا باید ادامه پیدا کند، از حلقههای خود خارج شوند روی.
را forEach
این روش برای زمانی خوب است که الزامات حلقه بسیار ساده ای دارید و نیازی به کنترل زیادی روی رفتار حلقه واقعی ندارید. با این حال، این سادگی هزینه دارد. حدود 95 درصد کندتر از داخلی است for
حلقه، اما برای اکثر مردم این کاهش سرعت ناچیز خواهد بود.
ساخته شده برای حلقه
ساخته شده در for
حلقه (همچنین به عنوان ساده شناخته می شود for
حلقه) احتمالاً شناخته شده ترین گزینه است زیرا در جاوا اسکریپت مانند بسیاری از زبان های دیگر کار می کند. نحو به شرح زیر است:
let items = ('one', 'two', 'three', 'four');
for (let i = 0; i < items.length; ++i) {
console.log(`${i}: ${items(i)}`);
}
// Output:
//
// 0: one
// 1: two
// 2: three
// 3: four
این نوع for
حلقه چندین مزیت دارد:
- برای اکثر برنامه نویسان آشناست
- ادامه حلقه کنترل
break
وcontinue
کلید واژه ها - جهت شمارنده را کنترل کنید (از طریق
++i
یا--i
) و نرخ (یعنیi+2
) - حلقه زنی جزئی (یعنی
for (let i = 0; i < items.length/2; ++i)
)
با این کنترل زیاد روی حلقه خود، باید با نحو پرمخاطب آن نیز کنار بیایید، به همین دلیل است که اغلب برای موارد استفاده ساده تر از آن اجتناب می شود.
توجه داشته باشید که مثال نشان داده شده در بالا فرض می کند که شما از ES6 جاوا اسکریپت استفاده می کنید، در غیر این صورت باید اعلام کنید i
با استفاده از متغیر var
و خارج از خود حلقه.
داخلی برای حلقه
احتمالاً رایج ترین اشکال حلقه زدن در جاوا اسکریپت که سوء تفاهم شده است، همان است for-in
حلقه در نگاه اول به نظر میرسد که میتوانید از این برای حلقه زدن در میان هر شاخص در یک آرایه استفاده کنید، اما در واقع به این منظور است که از طریق نام ویژگیهای شمارشپذیر یک شی، و نه لزوماً فقط فهرستها، حلقه بزنید.
برای مثال، روش استفاده از آن با آرایه ها در اینجا آمده است:
let items = ('one', 'two', 'three', 'four');
for (let i in items) {
console.log(`${i}: ${items(i)}`);
}
// Output:
//
// 0: one
// 1: two
// 2: three
// 3: four
و در اینجا روش استفاده از آن با اشیا آمده است:
let obj = {hi: 'bye', one: 'two', foo: 'bar'};
for (let o in obj) {
console.log(`${o}: ${obj(o)}`);
}
// Output
//
// hi: bye
// one: two
// foo: bar
بسیاری از توسعه دهندگان در واقع به صراحت توصیه می کنند که از این برای تکرار روی آرایه ها استفاده نکنید، به خصوص اگر ترتیب مهم باشد زیرا ترتیب تضمین نشده است.
اگر می خواهید روی آرایه ای با این سبک نحو حلقه بزنید، پس for-of
توصیه می شود که تمرکز بخش بعدی است.
داخلی برای حلقه
را for-of
حلقه ها نحو بسیار مشابهی دارند for-in
، که ما همین الان دیدیم. با این حال، تفاوت اصلی آنها این است که روی اشیاء تکرار شونده (مانند رشته ها، آرایه ها، نقشه ها، مجموعه ها و غیره) تکرار می شود، در حالی که for-in
روی تمام خصوصیات غیر نمادی و قابل شمارش یک شی تکرار می شود.
در عمل، این چیزی است که به نظر می رسد:
let items = ('one', 'two', 'three', 'four');
for (let i of items) {
console.log(i);
}
// Output:
//
// one
// two
// three
// four
توجه داشته باشید که i
متغیر دیگر شاخص نیست، بلکه مقدار واقعی آرایه است. و از آنجایی که فقط کار می کند روی تکرار شونده، دیگر نمی توانیم از یک شی استفاده کنیم:
let obj = {hi: 'bye', one: 'two', foo: 'bar'};
for (let o of obj) {
console.log(o);
}
// Output:
//
// TypeError: obj is not iterable
از نظر نحو و عملکرد، این کمی سازش بین Array.forEach
عملکرد و داخلی for
حلقه از آنجایی که نحو از ساده تر است for
حلقه، و همچنان به شما اجازه می دهد تا از کلمات کلیدی حلقه “کنترل” مانند break
و continue
، بر خلاف forEach
.
یکی دیگر از ویژگی های خوب این است که به خوبی با ژنراتورها کار می کند، بنابراین می توانید به راحتی از این مزیت در حلقه های خود استفاده کنید:
function* myWords() {
yield 'foo';
yield 'bar';
yield 'baz';
}
for (let w of myWords()) {
console.log(w);
}
// Output:
//
// foo
// bar
// baz
نتیجه
همانطور که می بینید، چندین راه برای انجام یک حلقه برای هر یک روی یک آرایه در جاوا اسکریپت وجود دارد، و ساختاری که انتخاب می کنید تا حد زیادی بستگی دارد. روی آنچه می خواهید انجام دهید و مورد استفاده خاص شما.
در این مقاله روش تکرار روی آرایه ها را با استفاده از آن دیدیم Array.forEach
، ساخته شده است for
حلقه ها، for-in
حلقه ها، و for-of
حلقه ها هر گونه انتقاد یا پیشرفتی را که مشاهده می کنید، در زیر نظر خود را بنویسید.
منتشر شده در 1403-01-26 00:47:03