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

قطعه قطعه کردن یک آرایه به معنای تقسیم آن به آرایه های کوچکتر با اندازه مشخص است. این تکنیک برای پردازش داده ها، صفحه بندی و موارد دیگر مفید است. در این وبلاگ، چهار روش برای تکه تکه کردن یک آرایه و مقایسه عملکرد آنها را بررسی خواهیم کرد.
راه اندازی اولیه:
ابتدا بیایید یک آرایه از اعداد 1 تا 10 ایجاد کنیم:
const arr = Array.from({ length: 10 }, (_, i) => i + 1);
Array.from() برای تولید یک آرایه با عناصر از 1 تا 10 استفاده می شود. اکنون، ما به چهار روش برای تکه کردن این آرایه نگاه خواهیم کرد.
روش 1: استفاده از حلقه For
function chunkArr(arr, size) {
let res = [];
for (let i = 0; i
Output:
[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ], [ 9, 10 ] ]
for: 4.363ms
توضیح:
این تابع از طریق آرایه در مراحل اندازه قطعه مشخص شده تکرار می شود. آرایه را در هر مرحله برش می دهد و آرایه فرعی حاصل را به آرایه نتیجه (res) اضافه می کند. اندازه گیری عملکرد نشان می دهد که حدود 4.363 میلی ثانیه طول کشیده است.
تفکیک تفصیلی:
- مقداردهی اولیه: یک آرایه نتیجه برای نگهداری تکه ها مقداردهی اولیه می شود.
- Looping: یک حلقه for روی آرایه با اندازه گام برابر با اندازه تکه تکرار می شود.
- Slicing: در هر تکرار، یک آرایه فرعی با استفاده از slice ایجاد می شود و به res اضافه می شود.
- Return: پس از تکمیل حلقه، تابع آرایه نتیجه حاوی تمام تکه ها را برمی گرداند.
روش 2: استفاده از Array.reduce()
function chunkArr2(arr, size) {
if (size {
if (i % size === 0) acc.push(arr.slice(i, i + size));
return acc;
}, []);
}
console.time("reduce");
console.log(chunkArr2(arr, 2));
console.timeEnd("reduce");
Output:
[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ], [ 9, 10 ] ]
reduce: 0.069ms
توضیح:
در اینجا Array.reduce() برای ساخت آرایه تکه شده استفاده می شود. بررسی می کند که آیا شاخص فعلی مضربی از اندازه تکه است و آرایه را بر اساس آن برش می دهد. این روش به طور قابل توجهی سریعتر است و تنها حدود 0.069 میلی ثانیه طول می کشد.
تفکیک تفصیلی:
- اعتبارسنجی: تابع بررسی می کند که آیا اندازه تکه معتبر است یا خیر.
- تابع کاهنده: روش کاهش روی آرایه تکرار می شود. برای هر عنصر، بررسی می کند که آیا شاخص مضربی از اندازه تکه است یا خیر.
- برش: زمانی که شاخص مضربی از اندازه تکه باشد، آرایه را برش می دهد و آرایه فرعی را به داخل انباشته فشار می دهد.
- بازگشت: انباشته حاوی آرایه های تکه تکه شده برگردانده می شود.
روش 3: استفاده از Array.splice()
let [list, chunkSize] = [arr, 2];
console.time('splice');
list = [...Array(Math.ceil(list.length / chunkSize))].map(_ => list.splice(0, chunkSize));
console.timeEnd('splice');
console.log(list);
Output:
[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ], [ 9, 10 ] ]
splice: 0.048ms
توضیح:
این رویکرد از Array.splice() در ترکیب با Array.map() برای تکه تکه کردن آرایه استفاده می کند. یک آرایه جدید با تعداد تکه های لازم ایجاد می کند و از splice() برای حذف و جمع آوری تکه ها از آرایه اصلی استفاده می کند. این روش نیز بسیار سریع است و حدود 0.048 میلی ثانیه زمان می برد.
تفکیک تفصیلی:
- مقداردهی اولیه: یک آرایه با تعداد تکه های مورد نیاز ایجاد کنید.
- نقشه برداری: از نقشه برای تکرار روی آرایه جدید استفاده کنید.
- Splicing: در هر تکرار، از splice برای حذف و جمع آوری تکه ها از آرایه اصلی استفاده کنید.
- بازگشت: آرایه حاصل از تکه ها برگردانده می شود.
روش 4: رویکرد بازگشتی
const chunk = function(array, size) {
if (!array.length) {
return [];
}
const head = array.slice(0, size);
const tail = array.slice(size);
return [head, ...chunk(tail, size)];
};
console.time('recursive');
console.log(chunk(arr, 2));
console.timeEnd('recursive');
Output:
[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ], [ 9, 10 ] ]
recursive: 4.372ms
توضیح:
این روش بازگشتی آرایه را به اولین تکه (سر) و عناصر باقیمانده (دم) تقسیم می کند. سپس به صورت بازگشتی دم را پردازش می کند و نتایج را به هم متصل می کند. اگرچه این روش ظریفتر است، اما کندتر از روشهای کاهش و اسپلایس است و حدود 4.372 میلیثانیه طول میکشد.
تفکیک تفصیلی:
- Base Case: اگر آرایه خالی است، یک آرایه خالی برگردانید.
- برش: آرایه را به سر (تکه اول) و دم (عناصر باقیمانده) تقسیم کنید.
- بازگشت: به صورت بازگشتی دم را پردازش کرده و نتایج را با سر به هم متصل کنید.
- بازگشت: نتیجه الحاقی برگردانده می شود.
هر چهار روش با موفقیت آرایه را به آرایه های فرعی با اندازه مشخص تقسیم می کنند. با این حال، عملکرد آنها به طور قابل توجهی متفاوت است:
- برای حلقه: 4.363 میلیثانیه
- کاهش: 0.069 میلیثانیه
- اتصال: 0.048 میلیثانیه
- بازگشتی: 4.372 میلیثانیه
روشهای اتصال و کاهش سریعترین روشها هستند و آنها را برای کاربردهای حیاتی ترجیح میدهند. در حالی که روش های حلقه for و بازگشتی عملکردی هستند، کندتر هستند و ممکن است برای مجموعه داده های بزرگ کمتر مناسب باشند.
توصیه ها
- عملکرد: برای عملکرد بهینه، از روش های اسپلایس یا کاهش استفاده کنید.
- خوانایی: روش بازگشتی خوانایی و ظرافت بیشتری را ارائه می دهد، اما به قیمت عملکرد.
- انعطاف پذیری: روش حلقه for ساده و قابل درک است و برای موارد استفاده ساده مناسب است.
با تشکر از شما برای خواندن!