تابع ()Array.flat در جاوا اسکریپت — راهنمای پیشرفته
تابعهای مفید زیادی وجود دارند که در طی چند سال اخیر به شیء سراسری Array در جاوا اسکریپت اضافه شدهاند. این تابعها گزینهای بسیار متنوعی در زمان کدنویسی و کار با آرایهها در اختیار توسعهدهندگان قرار میدهند. این تابعها چند مزیت دارند که مهمترین آنها این واقعیت است که گرچه در گذشته توسعهدهندگان مجبور بودند منطق پیچیده خودشان را برای اجرای برخی عملیات آرایهای پیادهسازی کنند، اما اینک با معرفی این تابعهای جدید نیاز به چنین پیادهسازیهای شخصی رفع شده است. یکی از این تابعهای مفید که در این راهنما مورد بررسی قرار میدهیم، تابع ()Array.flat در جاوا اسکریپت است.
مروری بر تابع ()Array.flat
تابع ()flat به ما امکان الحاق یک مجموعه از آیتمهای ارائه در یک آرایه کاملاً جدید و بازگشت دادن این آرایه جدید در زمان تکمیل شدن تابع را میدهد. از آنجا که این تابع یک آرایه کاملاً جدید ایجاد میکند، همه آرایههای موجود و کاملاً مجزایی که درون آرایه اصلی قرار دارند، پس از پایان کار تابع ()flat کاملاً دستنخورده باقی میمانند. بنابراین هیچ تدارک قبلی پیش از استفاده از این تابع جهت حفظ آرایههای موجود مورد نیاز نیست.
تابع ()flat تنها یک پارامتر میگیرد که optional است. این پارامتر منفرد optional نام دارد. این پارامتر تعداد سطوح آرایهای که تابع باید در یک سطح منفرد تسطیح کند را شامل میشود و در حالتی مورد نیاز است که آرایه شامل یک یا چند ساختار آرایهای تودرتو باشد. از آنجا که این پارامتر، اختیاری است، مقدار پیشفرض آن 1 است و تنها آرایههای سطح منفرد در یک ارائه کاملاً جدید تسطیح میشوند.
عدم استفاده از پارامتر
اینک که رفتار کلی تابع را توصیف کردیم، به بررسی برخی مثالها در مورد طرز کار عملی تابع ()flat میپردازیم. در مثال زیر موقعیتی را نمایش دادهایم که هیچ مقدار پارامتر تعیین نشده باشد:
1var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
2var array2 = array1.flat();
3// array2: [1, 2, 3, 4, [5, 6], [[7, 8]], [[[9, 10]]]]
تابع ()flat بدون هیچ مقدار پارامتر فراخوانی میشود. با در نظر گرفتن مقدار پیشفرض پارامتر، این فراخوانی تابع همانند فراخوانی به صورت (flat(1 است. این بدان معنی است که هر آرایهای با عمق یک در آرایه اصلی کاملاً تسطیح میشود به طوری که همه محتوای آن به صورت منفرد در یک آرایه جدید الحاق میشود. هر آرایه در آرایه اصلی با عمق دو یا بیشتر، دارای عمقی میشود که به میزان یک واحد کاهش مییابد و هر آیتم منفرد در این آرایهها به صورت منفرد در آرایه جدید الحاق خواهد شد. در نتیجه، آرایه اول در آرایه اصلی شامل 3 و 4 طوری تسطیح میشود که این دو آیتم به صورت انفرادی در آرایه جدید الحاق شوند. به علاوه، هر یک از سه آرایه تودرتوی باقیمانده در یک آرایه جدید با عمق تودرتوی خودشان که یک واحد کسر شده است الحاق مییابند.
عمق مثبت
مثال زیر موقعیتی را نشان میدهد که یک پارامتر depth مثبت تعیین شده باشد:
1var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
2var array2 = array1.flat(2);
3// array2: [1, 2, 3, 4, 5, 6, [7, 8], [[9, 10]]]
تابع ()flat با یک پارامتر depth با مقدار 2 فراخوانی میشود. این به آن معنی است که هر آرایهای با عمقی تا حداکثر دو در آرایه اصلی به طور کامل تسطیح میشود به طوری که همه محتوای آن به صورت تک به تک در آرایه جدید الحاق میشود. از سوی دیگر، هر آرایه در آرایه اصلی با عمق سه یا بیشتر دو واحد از عمق خود را از دست میدهد و همه آیتمهای منفرد در اعماق یک یا دو در این آرایهها در یک آرایه جدید الحاق میشوند. در نتیجه دو آرایه اول در آرایه اصلی شامل 3 و 4 و 5 و 6 طوری تسطیح میشوند که این چهار آیتم به صورت انفرادی در آرایه جدید الحاق مییابند. به علاوه هر یک از دو آرایه تودرتوی باقی مانده با کاهش عمق تودرتوی خود به میزان دو واحد در آرایه جدید الحاق میشوند.
عمق بینهایت
در مثال زیر موقعیتی را میبینید که از یک پارامتر depth بینهایت استفاده شده است:
1var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
2var array2 = array1.flat(Infinity);
3// array2: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
تابع ()flat با مقدار پارامتر depth Infinity فراخوانی میشود. این به آن معنی است که همه آرایهها با هر عمقی در آرایه اصلی طوری تسطیح میشوند که همه محتوایشان به صورت انفرادی در آرایه جدید الحاق یابد. یک نکته مهم که همواره باید به خاطر داشته باشید این است که وقتی از یک مقدار مانند Infinity در تابع ()flat استفاده میکنید، اپلیکیشن ممکن است در صورت مواجهه با آرایههای با عمق تودرتوی زیاد دچار کمبود حافظه شود. با این که Infinity در اینجا برای نمایش این نکته استفاده شده است که در این تابع میتوان از چنین مقادیری نیز استفاده کرد، اما توصیه میشود که از مقادیر کوچکتر متناهی برای پارامتر استفاده شود تا از بروز مشکلات غیر قابل پیشبینی در اپلیکیشنها جلوگیری شود.
عمق صفر
در مثال زیر موقعیتی دیده میشود که در آن از مقدار صفر برای پارامتر depth استفاده شده است:
1var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
2var array2 = array1.flat(0);
3// array2: [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]]
تابع ()flat با مقدار صفر برای پارامتر depth فراخوانی شده است و معنی آن این است که هیچ آرایهای در آرایه اصلی تسطیح نمیشود و آرایه جدید دقیقاً همان ترکیببندی آیتمهای آرایه اصلی را خواهد داشت و وضعیت آرایههای تودرتو نیز دستنخورده میماند.
عمق منفی
در مثال زیر موقعیتی دیده میشود که در آن از مقدار منفی برای پارامتر depth استفاده شده است:
1var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
2var array2 = array1.flat(-Infinity);
3// array2: [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]]
تابع ()flat در ک فوق با مقدار -Infinity برای پارامتر depth فراخوانی شده است. با توجه به این واقعیت که مقدار عمق منفی از نظر تسطیح آرایههای تودرتو معنایی ندارد، در صورت استفاده از مقدار منفی برای پارامتر depth در عمل به جای آن از مقدار صفر استفاده میشود. در مثال قبلی که از مقدار 0 برای این پارامتر استفاده شده بود، هیچ آرایهای در آرایه اصلی تسطیح نشد و آرایه جدی دقیقاً همان ترکیببندی آرایه اصلی را داشت.
جمعبندی
در این راهنما با چند نکته در خصوص تابع ()flat آشنا شدیم. نکته نخست که باید به خاطر بسپاریم این است که تابع ()flat هیچ آرایه نرمال یا تودرتویی را در آرایه اصلی به هیچ طریقی تغییر نمیدهد و از این رو نیازی به حفظ حالتهای این آرایهها پیش از استفاده از این تابع وجود ندارد. تنها آرایهای که از سوی تابع ()flat تغییر مییابد، آرایه کاملاً جدیدی است که در زمان پایان کار تابع بازگشت مییابد و صرفاً با استفاده از محتوای آرایه اصلی ساخته شده است.
دومین نکته که باید به خاطر بسپاریم این است که تابع falt() همه اسلاتهای خالی را در آرایه اصلی حذف میکند. در مثال زیر این کارکرد را در عمل مشاهده میکنید:
1var array1 = [1, , 3, , 5];
2var array2 = array1.flat();
3// array2: [1, 3, 5]
با این که در آرایه اصلی، پنج اسلات اشغالشده است، اما اسلاتهای دوم و چهارم دارای مقادیر undefined هستند و از این رو تابع ()flat این دو آیتم را در آرایه جدیدی که بازگشت میدهد، حذف خواهد کرد. در نتیجه آرایه جدید تنها سه آیتم دارد و شامل هیچ مقدار undefined نیست.
نکته سوم و آخری که باید در خاطر خود داشته باشیم این است که تابع ()flat یک تابع چندمنظوره است که بسته به منطقی که میخواهید در کد خود پیادهسازی کنید، میتواند آن را سادهسازی کند. پیشتر و در زمان عدم امکان استفاده از تابع ()flat روش عمل برای تسطیح همه آیتمهای موجود در همه آرایهها این بود که یک منطق سفارشی برای تکرار روی حلقه بنویسید و همه آیتمها را به صورت تک به تک از یک آرایه استخراج کرده و کنار همدیگر قرار دهید که در مورد آرایههای تودرتو به مسیری طولانی نیاز داشت. چنین منطقی غالباً شلوغ و مستعد خطا بود و از این رو با معرفی تابع ()flat دیگر نیازی به نوشتن چنان منطقهای سفارشی وجود ندارد.
سخن پایانی
از مطالعه این راهنما سپاسگزاریم و امیدواریم با خواندن این مقاله در خصوص تابع ()flat در جاوا اسکریپت که به شیء سراسری Array مربوط است اطلاعات مناسبی کسب کرده باشید و بتوانید از آن در کدهای خود استفاده کنید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای جاوا اسکرپیت
- مجموعه آموزشهای برنامهنویسی
- آموزش JavaScript ES6 (جاوااسکریپت)
- ۶ متد آرایه جاوا اسکریپت برای کدنویسی بهینهتر — راهنمای کاربردی
- تبدیل شیء به آرایه در جاوا اسکریپت — به زبان ساده
==