# پروژه اولیه
پروژه اولیه را از [این لینک](/contest/assignments/64549/download_problem_initial_project/220471/) دانلود کنید.
ساختار فایلهای این پروژه به صورت زیر است:
```
removeDuplicate
├── src
│ └── <mark>index.js</mark>
├── jest.config.js
├── package-lock.json
└── package.json
```
برای اینکه کادر اجرایی بوتکمپ بتوانند راحتتر و سریعتر به دادههای کدآموزهای بوتکمپ دسترسی داشته باشند، نگهداری و بررسی آنها اهمیت زیادی دارد. اما متاسفانه هنگام وارد کردن این اطلاعات به صورت دستی، مشکلی پیش آمد و اسم بعضی از کدآموزها بیشتر از یک بار وارد شد...!
از طرف مدیر بوتکمپ، تسکی به شما داده شده تا با پیادهسازی تابع `removeDuplicateStudents`، کدآموزهای تکراری را پیدا کنید و فقط یک نسخه از دادههای مربوط به هر کاربر را حفظ و بقیه را حذف کنید.
برای پیادهسازی تابع `removeDuplicateStudents` لازم است به این موارد دقت کنید:
1. این تابع به عنوان ورودی، یک آرایه دریافت میکند.
عناصر این آرایه، آبجکتهایی هستند که هر کدام از آنها مربوط به اطلاعات یک کدآموز است.
2. هر آبجکت مربوط به اطلاعات یک کدآموز دارای پراپرتیهای زیر است:
1. level
2. grade*
3. name*
4. lastName*
5. birthDate*
6. nationality
7. email
3. از ترکیب مقدار پراپرتیهای `grade`، `name`، `lastNam`، `birthDate` میتوان برای مشخص کردن و تفکیک کدآموزها استفاده کرد. به عبارت دیگر نباید هیچ دو کدآموزی با مقادیر برابر این ویژگیها وجود داشته باشند و ترکیب این مقادیر برای هر کدآموز منحصربفرد هستند.
4. در صورتی که چند نسخه از اطلاعات یک کدآموز موجود بود، نسخهای که مقدار پراپرتی `level` در آن بیشتر است، نگهداری میشود و بقیه نسخهها حذف میشوند.
5. در صورتی که مقدار پراپرتی `level` در چند نسخه از اطلاعات یک کدآموز مشترک بود، اولویت با نسخهای که دارای مقدار **index** کمتری است خواهد بود و بقیه نسخهها حذف میشوند.
6. همهی عناصر آرایه خروجی باید دارای یک پراپرتی اضافه با کلید `id` باشند، مقدار `id` از ترکیب مقدار پراپرتیهای `grade`، `name`، `lastNam`، `birthDate` به ترتیب از راست به چپ به دست میآید.
# مثال
در مثال زیر سه نسخه از اطلاعات کاربری به اسم `Jone doe` وجود دارد.
از آنجا که تمامی چهار ویژگی `grade`، `name`، `lastNam`، `birthDate` در این سه شیء برابر هستند، نتیجه میگیریم اطلاعات این کاربر سه بار و به صورت تکراری ذخیره شده است.
برای تشخیص نسخه معتبر، ابتدا ویژگی `level` را بررسی میکنیم و آبجکتی که مقدار `level` بیشتری دارد را نگه داشته و بقیه را حذف میکنیم.
در ادامه دو آبجکت که مقدار پراپرتی `level` در هردوی آنها برابر ۳ است را بر اساس جایگاهشان در آرایه مقایسه کرده و آبجکتی که **index** کوچکتری دارد را نگه داشته و بقیه نسخهها را حذف می کنیم.
نباید فراموش کنیم که در آرایه خروجی، تمامی عناصر آرایه دارای پراپرتی `id` هستند.
مقدار `id` از ترکیب مقادیر پراپرتیهای `grade`، `name`، `lastNam`، `birthDate` به ترتیب حاصل میشود.
## ورودی
```
const studentsArray = [
{
level: 2,
grade: 10,
name: "John",
lastName: "Doe",
birthDate: "2002-05-20",
nationality: "American",
email: "john.doe@example.com"
},
{
level: 3,
grade: 10,
name: "John",
lastName: "Doe",
birthDate: "2002-05-20",
nationality: "American",
email: "john.doe@example.com"
},
{
level: 3,
grade: 10,
name: "John",
lastName: "Doe",
birthDate: "2002-05-20",
nationality: "Iran",
email: "john.doe@example.com"
},
{
level: 3,
grade: 10,
name: "Saimon",
lastName: "Jonse",
birthDate: "2002-06-20",
nationality: "Italy",
email: "Saimon.Jonse@example.com"
},
];
```
## خروجی
```
const studentsArray = [
{
level: 3,
grade: 10,
name: "John",
lastName: "Doe",
birthDate: "2002-05-20",
nationality: "American",
email: "john.doe@example.com",
id: "10JohnDoe2002-05-20"
},
{
level: 3,
grade: 10,
name: "Saimon",
lastName: "Jonse",
birthDate: "2002-06-20",
nationality: "Italy",
email: "Saimon.Jonse@example.com",
id: "10SaimonJonse2002-06-20"
},
];
```
# جزئیات
1. تابع `removeDuplicate` آرایهای از اطلاعات کدآموزها را به عنوان ورودی دریافت میکند.
2. خروجی تابع `removeDuplicate` آرایهای از اطلاعات کدآموزهاست که نسخههای تکراری اطلاعات در آن حذف شده و هر کدام از عناصر آن دارای پراپرتی `id` باشد.
3. شما تنها مجاز به تغییر فایل `index.js` هستید.
4. فایل ارسالی شما باید `index.js` باشد.