جاوااسکریپت یک عملگر داخلی ... دارد که کار کردن با تعداد نامشخصی از عناصر را آسانتر میکند. بسته به بافت، به آن «عملگر rest» یا «عملگر spread» میگویند.
وقتی ... در سمت چپ یک انتساب ظاهر میشود، به آن سه نقطه عملگر rest میگویند. به آن سه نقطه همراه با یک اسم متغیر، «عنصر rest» میگویند. این عنصر صفر یا چند مقدار را جمع میکند و آنها را در یک آرایه ذخیره میکند.
const [a, b, ...everythingElse] = [0, 1, 1, 2, 3, 5, 8];
a;
// => 0
b;
// => 1
everythingElse;
// => [1, 2, 3, 5, 8]
توجه کنید که در جاوااسکریپت، برخلاف برخی زبانهای دیگر، عنصر rest نمیتواند کامای پایانی داشته باشد. این عنصر باید آخرین عنصر در یک انتساب ساختارشکنی باشد. مثال زیر یک SyntaxError پرتاب میکند:
const [...items, last] = [2, 4, 8, 16]
همانند آرایهها، از عملگر rest میتوان برای جمع کردن یک یا چند ویژگی شیء و ذخیرهی آنها در یک شیء واحد هم استفاده کرد.
const { street, ...address } = {
street: 'Platz der Republik 1',
postalCode: '11011',
city: 'Berlin',
};
street;
// => 'Platz der Republik 1'
address;
// => {postalCode: '11011', city: 'Berlin'}
وقتی ... در تعریف یک تابع، کنار آخرین آرگومان آن ظاهر میشود، به آن پارامتر، «پارامتر rest» میگویند. این پارامتر به تابع اجازه میدهد تعداد نامشخصی آرگومان را بهصورت یک آرایه بپذیرد.
function concat(...strings) {
return strings.join(' ');
}
concat('one');
// => 'one'
concat('one', 'two', 'three');
// => 'one two three'
وقتی ... در سمت راست یک انتساب ظاهر میشود، به آن «عملگر spread» میگویند. این عملگر یک آرایه را به فهرستی از عناصر گسترش میدهد. برخلاف عنصر rest، این عنصر میتواند هرجایی در یک عبارت آرایهی تحتاللفظی ظاهر شود و میتواند بیش از یکی باشد.
const oneToFive = [1, 2, 3, 4, 5];
const oneToTen = [...oneToFive, 6, 7, 8, 9, 10];
oneToTen;
// => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
const woow = ['A', ...oneToFive, 'B', 'C', 'D', 'E', ...oneToFive, 42];
woow;
// => ["A", 1, 2, 3, 4, 5, "B", "C", "D", "E", 1, 2, 3, 4, 5, 42]
همانند آرایهها، از عملگر spread میتوان برای کپی کردن ویژگیها از یک شیء به شیء دیگر هم استفاده کرد.
let address = {
postalCode: '11011',
city: 'Berlin',
};
address = { ...address, country: 'Germany' };
// => {
// postalCode: '11011',
// city: 'Berlin',
// country: 'Germany',
// }
دوستتان لینوس رانندهی قطار است و قطارهای باری را بین شهرها میراند. اگرچه در کار با قطارها فوقالعاده است، اما در مدیریت لجستیک یا کار با رایانه چندان مهارتی ندارد. او میخواهد از کمک برنامهنویسی شما برای سازماندهی اطلاعات قطار و اصلاح اشتباههای دادههای مسیر استفاده کند.
برای تمرین، از عملگر rest یا spread برای حل هر یک از کارهای زیر استفاده کنید.
دوستتان از شناسهی هر واگن (ID) نگهداری میکند، اما هیچوقت مطمئن نیست که سامانه در هر لحظه چند واگن را باید پردازش کند.
اگر این دادهها در یک array یکپارچه بستهبندی شوند، کار بقیهی برنامهی لجستیک بسیار راحتتر میشود.
تابعی به اسم getListOfWagons پیادهسازی کنید که تعداد دلخواهی از شناسههای واگن را میپذیرد؛ این شناسهها همان شناسههای واگنها هستند.
هر شناسه یک عدد صحیح مثبت خواهد بود.
سپس تابع باید شناسههای دادهشده را بهصورت یک array واحد برگرداند.
getListOfWagons(1, 7, 12, 3, 14, 8, 5);
// => [1, 7, 12, 3, 14, 8, 5]
در این مرحله، کمکم با دادهها و نحوهی استفادهشان در برنامهی لجستیک آشنا میشوید. سامانهی شناسه همیشه به لوکوموتیو شناسهی ۱ میدهد و به بقیهی واگنهای قطار شناسهای میدهد که بهصورت تصادفی انتخاب شده و بزرگتر از ۱ است.
دوستتان مجبور شده دو واگن جدید را به قطار وصل کند و یادش رفته سامانه را بهروزرسانی کند!
اکنون باید دو واگن اول در array قطار به انتها منتقل شوند، وگرنه همهچیز از ترتیب خارج میشود.
لینوس از اینکه اشتباههایش را درست کنید واقعاً سپاسگزار خواهد بود.
تابعی به اسم fixListOfWagons پیادهسازی کنید که یک آرایه از شناسهی هر واگن میپذیرد.
این تابع یک array را return میکند که در آن ۲ عنصر اول به انتهای array منتقل شدهاند تا لوکوموتیو در جلو قرار بگیرد.
eachWagonsID = [2, 5, 1, 7, 4, 12, 6, 3, 13];
fixListOfWagons(eachWagonsID);
// => [1, 7, 4, 12, 6, 3, 13, 2, 5]
وای! به نظر میرسد چند واگن گم شدهاند.
خوشبختانه، دوستتان همین حالا array دیگری پیدا کرده است که به نظر میرسد شناسههای واگنهای گمشده را در خود دارد و میخواهد آنها را به array اصلی شناسهی واگنها اضافه کنید.
تنها چیزی که به خاطر دارد این است که مقدارهای گمشده باید دقیقاً بعد از لوکوموتیو تعیینشده قرار بگیرند.
با توجه به این اطلاعات جدید، تابعی به اسم correctListOfWagons بنویسید که دو آرایه را به عنوان آرگومان میگیرد که شناسهی هر واگن در آنهاست.
شناسههای واگن در array دوم باید مستقیماً بعد از لوکوموتیو (شناسه ۱) به array اول اضافه شوند.
eachWagonsID = [1, 5, 20, 7, 4, 8];
missingWagons = [3, 17, 6, 15];
correctListOfWagons(eachWagonsID, missingWagons);
// => [1, 3, 17, 6, 15, 5, 20, 7, 4, 8]
اکنون که همهی دادههای واگن درست است، دوستتان میخواهد اطلاعات مسیر سامانه را بهروزرسانی کنید.
اطلاعات مسیر اولیه بهصورت یک object ساخته شده است و دوستتان میخواهد آن را با افزودههای ارائهشده بهروزرسانی کنید.
هر مسیر به اطلاعات کمی متفاوتی نیاز دارد، بنابراین دوستتان واقعاً یک راهحل عمومی را ترجیح میدهد.
تابعی به اسم extendRouteInformation پیادهسازی کنید که دو objects میپذیرد.
object اول مشخص میکند که مسیر قطار بین کدام شهرها حرکت میکند.
object دوم جزئیات دیگر مسیر مانند سرعت یا طول قطار را در خود دارد.
تابع باید یک object یکپارچه با تمام اطلاعات مسیر برگرداند.
متغیر moreRouteInformation میتواند ویژگیهای متفاوتی داشته باشد.
route = { from: 'Berlin', to: 'Hamburg' };
moreRouteInformation = { length: '100', speed: '50' };
extendRouteInformation(route, moreRouteInformation);
// => {from: "Berlin", to: "Hamburg", length: "100", speed: "50"}
دوستتان متوجه شده است که به زمان رسیدن در اطلاعات مسیر نیازی ندارد. بنابراین دوستتان میخواهد زمان رسیدن را از اطلاعات مسیر جدا کنید.
تابعی به اسم separateTimeOfArrival پیادهسازی کنید که یک شیء با اطلاعات مسیر میپذیرد.
تابع باید یک آرایه برگرداند که عنصر اول آن زمان رسیدن است و عنصر دوم آن شیئی با اطلاعات مسیر بدون زمان رسیدن.
routeInformation = {
from: 'Berlin',
to: 'Hamburg',
length: '100',
timeOfArrival: '10:10',
};
separateTimeOfArrival(routeInformation);
// => ["10:10", {from: "Berlin", to: "Hamburg", length: "100"}]
در Exercism ثبتنام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.