مسیرها
/
JavaScript
JavaScript
/
تمرین‌ها
/
راننده‌ی قطار
راننده‌ی قطار

راننده‌ی قطار

تمرین یادگیری

مقدمه

جاوااسکریپت یک عملگر داخلی ... دارد که کار کردن با تعداد نامشخصی از عناصر را آسان‌تر می‌کند. بسته به بافت، به آن «عملگر rest» یا «عملگر spread» می‌گویند.

عملگر rest

عناصر rest

وقتی ... در سمت چپ یک انتساب ظاهر می‌شود، به آن سه نقطه عملگر 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

همانند آرایه‌ها، از عملگر rest می‌توان برای جمع کردن یک یا چند ویژگی شیء و ذخیره‌ی آن‌ها در یک شیء واحد هم استفاده کرد.

const { street, ...address } = {
  street: 'Platz der Republik 1',
  postalCode: '11011',
  city: 'Berlin',
};
street;
// => 'Platz der Republik 1'
address;
// => {postalCode: '11011', city: 'Berlin'}

پارامترهای rest

وقتی ... در تعریف یک تابع، کنار آخرین آرگومان آن ظاهر می‌شود، به آن پارامتر، «پارامتر rest» می‌گویند. این پارامتر به تابع اجازه می‌دهد تعداد نامشخصی آرگومان را به‌صورت یک آرایه بپذیرد.

function concat(...strings) {
  return strings.join(' ');
}
concat('one');
// => 'one'
concat('one', 'two', 'three');
// => 'one two three'

عملگر spread

عناصر spread

وقتی ... در سمت راست یک انتساب ظاهر می‌شود، به آن «عملگر 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

همانند آرایه‌ها، از عملگر spread می‌توان برای کپی کردن ویژگی‌ها از یک شیء به شیء دیگر هم استفاده کرد.

let address = {
  postalCode: '11011',
  city: 'Berlin',
};
address = { ...address, country: 'Germany' };
// => {
//   postalCode: '11011',
//   city: 'Berlin',
//   country: 'Germany',
// }

دستورالعمل‌ها

دوستتان لینوس راننده‌ی قطار است و قطارهای باری را بین شهرها می‌راند. اگرچه در کار با قطارها فوق‌العاده است، اما در مدیریت لجستیک یا کار با رایانه چندان مهارتی ندارد. او می‌خواهد از کمک برنامه‌نویسی شما برای سازمان‌دهی اطلاعات قطار و اصلاح اشتباه‌های داده‌های مسیر استفاده کند.

Note

برای تمرین، از عملگر rest یا spread برای حل هر یک از کارهای زیر استفاده کنید.

1. ایجاد فهرستی از همه‌ی واگن‌ها

دوستتان از شناسه‌ی هر واگن (ID) نگهداری می‌کند، اما هیچ‌وقت مطمئن نیست که سامانه در هر لحظه چند واگن را باید پردازش کند. اگر این داده‌ها در یک array یکپارچه بسته‌بندی شوند، کار بقیه‌ی برنامه‌ی لجستیک بسیار راحت‌تر می‌شود.

تابعی به اسم getListOfWagons پیاده‌سازی کنید که تعداد دلخواهی از شناسه‌های واگن را می‌پذیرد؛ این شناسه‌ها همان شناسه‌های واگن‌ها هستند. هر شناسه یک عدد صحیح مثبت خواهد بود. سپس تابع باید شناسه‌های داده‌شده را به‌صورت یک array واحد برگرداند.

getListOfWagons(1, 7, 12, 3, 14, 8, 5);
// => [1, 7, 12, 3, 14, 8, 5]

2. انتقال دو عنصر اول به انتهای آرایه

در این مرحله، کم‌کم با داده‌ها و نحوه‌ی استفاده‌شان در برنامه‌ی لجستیک آشنا می‌شوید. سامانه‌ی شناسه همیشه به لوکوموتیو شناسه‌ی ۱ می‌دهد و به بقیه‌ی واگن‌های قطار شناسه‌ای می‌دهد که به‌صورت تصادفی انتخاب شده و بزرگ‌تر از ۱ است.

دوستتان مجبور شده دو واگن جدید را به قطار وصل کند و یادش رفته سامانه را به‌روزرسانی کند! اکنون باید دو واگن اول در 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]

3. افزودن مقدارهای گم‌شده

وای! به نظر می‌رسد چند واگن گم شده‌اند.

خوشبختانه، دوستتان همین حالا 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]

4. گسترش اطلاعات مسیر

اکنون که همه‌ی داده‌های واگن درست است، دوستتان می‌خواهد اطلاعات مسیر سامانه را به‌روزرسانی کنید. اطلاعات مسیر اولیه به‌صورت یک object ساخته شده است و دوستتان می‌خواهد آن را با افزوده‌های ارائه‌شده به‌روزرسانی کنید. هر مسیر به اطلاعات کمی متفاوتی نیاز دارد، بنابراین دوستتان واقعاً یک راه‌حل عمومی را ترجیح می‌دهد.

تابعی به اسم extendRouteInformation پیاده‌سازی کنید که دو objects می‌پذیرد. object اول مشخص می‌کند که مسیر قطار بین کدام شهرها حرکت می‌کند.

object دوم جزئیات دیگر مسیر مانند سرعت یا طول قطار را در خود دارد. تابع باید یک object یکپارچه با تمام اطلاعات مسیر برگرداند.

Note

متغیر moreRouteInformation می‌تواند ویژگی‌های متفاوتی داشته باشد.

route = { from: 'Berlin', to: 'Hamburg' };
moreRouteInformation = { length: '100', speed: '50' };
extendRouteInformation(route, moreRouteInformation);
// => {from: "Berlin", to: "Hamburg", length: "100", speed: "50"}

5. جدا کردن زمان رسیدن از اطلاعات مسیر

دوستتان متوجه شده است که به زمان رسیدن در اطلاعات مسیر نیازی ندارد. بنابراین دوستتان می‌خواهد زمان رسیدن را از اطلاعات مسیر جدا کنید.

تابعی به اسم separateTimeOfArrival پیاده‌سازی کنید که یک شیء با اطلاعات مسیر می‌پذیرد. تابع باید یک آرایه برگرداند که عنصر اول آن زمان رسیدن است و عنصر دوم آن شیئی با اطلاعات مسیر بدون زمان رسیدن.

routeInformation = {
  from: 'Berlin',
  to: 'Hamburg',
  length: '100',
  timeOfArrival: '10:10',
};
separateTimeOfArrival(routeInformation);
// => ["10:10", {from: "Berlin", to: "Hamburg", length: "100"}]
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
JavaScript Exercism

آماده‌اید راننده‌ی قطار را شروع کنید؟

در Exercism ثبت‌نام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.